En son taahh├╝tleri Git ile yeni bir ┼čubeye ta┼č─▒y─▒n


Al─▒nan cevaba git


Master yapmak i├žin taahh├╝t etti─čim son birka├ž komisyonu yeni bir ┼čubeye ta┼č─▒mak ve bu komisyonlar kurulmadan ├Ânce master'─▒ geri almak istiyorum. Maalesef Git-fu'm hen├╝z yeterince g├╝├žl├╝ de─čil mi, herhangi bir yard─▒m?

Yani bundan nas─▒l gidebilirim

 master A - B - C - D - E
 

buna?

 newbranch     C - D - E
             /
master A - B 
 

4581









Cevap say─▒s─▒n─▒ say: 13






Mevcut bir ┼čubeye ta┼č─▒nmak

Taahh├╝tlerinizi mevcut bir ┼čubeye ta┼č─▒mak istiyorsan─▒z , ┼čunun gibi g├Âr├╝necektir:

 git checkout existingbranch
git merge master         # Bring the commits here
git checkout master
git reset --keep HEAD~3  # Move master back by 3 commits.
git checkout existingbranch
 

Bu --keep se├ženek, ili┼čkisiz dosyalarda yapabilece─činiz herhangi bir tamamlanmam─▒┼č de─či┼čikli─či korur ya da bu de─či┼čikliklerin ├╝zerine yaz─▒lmas─▒ gerekip gerekmedi─čini, ne yapt─▒─č─▒na benzer ┼čekilde iptal git checkout eder. E─čer iptal ederse, git stash de─či┼čikliklerinizi yap─▒n ve yeniden deneyin ya --hard da de─či┼čiklikleri kaybetmek i├žin kullan─▒n (taahh├╝tler aras─▒nda de─či┼čmeyen dosyalardan bile!)

Yeni bir ┼čubeye ta┼č─▒nmak

Bu y├Ântem, first komutu ( git branch newbranch ) ile yeni bir dal olu┼čturarak ├žal─▒┼č─▒r, buna ge├ži┼č yapmaz. Daha sonra mevcut ┼čubeyi (ana) geri al─▒p ├žal─▒┼čmaya devam etmek i├žin yeni ┼čubeye ge├žiyoruz.

 git branch newbranch      # Create a new branch, containing all current commits
git reset --keep HEAD~3   # Move master back by 3 commits (Make sure you know how many commits you need to go back)
git checkout newbranch    # Go to the new branch that still has the desired commits
# Warning: after this it's not safe to do a rebase in newbranch without extra care.
 

Fakat ka├ž tane geri d├Ânece─čine emin ol. Alternatif olarak, bunun yerine, geri d├Ânmek istedi─činiz HEAD~3 taahh├╝d├╝n (veya referans─▒n benzeri origin/master ) karmas─▒n─▒ sa─člayabilirsiniz , ├Ârne─čin:

 git reset --keep a1b2c3d4
 

UYARI: Git s├╝r├╝m 2.0 ve sonraki s├╝r├╝mlerinde, daha sonra git rebase orijinal ( master ) dal─▒na yeni dal --no-fork-point eklerseniz, ana daldan ├ž─▒kard─▒─č─▒n─▒z taahh├╝tleri kaybetmemek i├žin yeniden y├╝kleme s─▒ras─▒nda a├ž─▒k bir se├žene─če ihtiyac─▒n─▒z olabilir . Having branch.autosetuprebase always seti bu daha olas─▒ hale getirir. Ayr─▒nt─▒lar i├žin John Mellor'─▒n cevab─▒na bak─▒n─▒z.


5831







Neden i┼če yarad─▒─č─▒n─▒ merak edenler i├žin (ilk ba┼čta oldu─čum gibi):

C'ye geri d├Ânmek ve D ve E'yi yeni ┼čubeye ta┼č─▒mak istiyorsunuz. ─░┼čte ilk ba┼čta g├Âr├╝nd├╝─č├╝ gibi:

 A-B-C-D-E (HEAD)
        ÔćĹ
      master
 

Sonra git branch newBranch :

     newBranch
        Ôćô
A-B-C-D-E (HEAD)
        ÔćĹ
      master
 

Sonra git reset --hard HEAD~2 :

     newBranch
        Ôćô
A-B-C-D-E (HEAD)
    ÔćĹ
  master
 

Bir dal sadece bir i┼čaret├ži oldu─čundan, usta son taahh├╝d├╝ne i┼čaret etti. NewBranch'─▒ yapt─▒─č─▒n─▒zda, son g├Âreve yeni bir i┼čaret├ži koydunuz . Sonra kullanarak git reset Ta┼č─▒d─▒─č─▒n─▒z usta geri iki hareketin i┼čaret├žisi. Ancak yeni ┼×ubenizi hareket ettirmedi─činiz i├žin , hala ba┼člang─▒├žta yapt─▒─č─▒ taahh├╝d├╝ i┼čaret ediyor.


963







Genel olarak...

Bu durumda sykora'n─▒n maruz b─▒rakt─▒─č─▒ y├Ântem en iyi se├ženektir. Ancak bazen en kolay de─čildir ve genel bir y├Ântem de─čildir. Genel bir y├Ântem i├žin git cherry-pick kullan─▒n :

OP'nin istedi─čini elde etmek i├žin, 2 a┼čamal─▒ bir s├╝re├ž:

Ad─▒m 1 - ─░stedi─činiz masterÔÇÖdan hangisinin taahh├╝tte bulundu─čunu not edin. newbranch

ger├žekle┼čtirmek

 git checkout master
git log
 

─░stedi─činiz taahh├╝tleri s├Âyleyin (3 say─▒n) newbranch . Burada kullanaca─č─▒m:
C taahh├╝t: 9aa1233
D taahh├╝t: 453ac3d
E taahh├╝t: 612ecb3

Not: ─░lk yedi karakteri ya da t├╝m i┼člem karmas─▒n─▒ kullanabilirsiniz

Ad─▒m 2 - Onlar─▒ giy newbranch

 git checkout newbranch
git cherry-pick 612ecb3
git cherry-pick 453ac3d
git cherry-pick 9aa1233
 

VEYA (Git 1.7.2+ s├╝r├╝m├╝nde, aral─▒klar─▒ kullan─▒n)

 git checkout newbranch
git cherry-pick 612ecb3~1..9aa1233
 

git cherry-pick, bu ├╝├ž ┼čirketi newbranch'a uygular.


421


2012-02-07





Bunu yapman─▒n ba┼čka bir yolu, sadece 2 komut kullanarak. Ayr─▒ca mevcut ├žal─▒┼čma a─čac─▒n─▒z─▒ sa─člam tutar.

 git checkout -b newbranch # switch to a new branch
git branch -f master HEAD~3 # make master point to some older commit
 

Eski versiyon - ├Â─črenmeden ├Ânce git branch -f

 git checkout -b newbranch # switch to a new branch
git push . +HEAD~3:master # make master point to some older commit 
 

Edememek push i├žin . bilmek g├╝zel hile.


302







├ľnceki cevaplar─▒n ├žo─ču tehlikeli ┼čekilde yanl─▒┼čt─▒r!

Bunu yapma:

 git branch -t newbranch
git reset --hard HEAD~3
git checkout newbranch
 

Bir dahaki sefere ko┼čtu─čunuzda git rebase (veya git pull --rebase ) bu 3 komisyon sessizce at─▒l─▒r newbranch ! (a┼ča─č─▒daki a├ž─▒klamaya bak─▒n─▒z)

Bunun yerine ┼čunu yap─▒n:

 git reset --keep HEAD~3
git checkout -t -b newbranch
git cherry-pick [email protected]{2}
 
  • ├ľncelikle en son 3 s├Âzle┼čmeyi atar (kabul edilmeyen de─či┼čiklikleri atmak yerine ba┼čar─▒s─▒z --keep oldu─ču gibi --hard , ancak daha g├╝venlidir).
  • Sonra ├žatallar newbranch .
  • Daha sonra bu 3 komisyonu geri al─▒r newbranch . Art─▒k bir dal taraf─▒ndan ba┼čvuruda bulunmad─▒klar─▒ i├žin, git'in reflogunu kullanarak bunu yapar : 2 i┼člemden ├Ânce ge├žen, yani bizden ├Ânce kontrol ettikten [email protected]{2} sonra HEAD , newbranch 2. git reset taahh├╝tleri atmak i├žin kullan─▒lan taahh├╝t.

Uyar─▒: reflog varsay─▒lan olarak etkindir, ancak manuel olarak devre d─▒┼č─▒ b─▒rakt─▒ysan─▒z (├Ârne─čin bir "├ž─▒plak" git deposu kullanarak), ├žal─▒┼čt─▒rd─▒ktan sonra 3 komisyonu geri alamazs─▒n─▒z git reset --keep HEAD~3 .

Reflog'a dayanmayan bir alternatif:

 # newbranch will omit the 3 most recent commits.
git checkout -b newbranch HEAD~3
git branch --set-upstream-to=oldbranch
# Cherry-picks the extra commits from oldbranch.
git cherry-pick ..oldbranch
# Discards the 3 most recent commits from oldbranch.
git branch --force oldbranch oldbranch~3
 

(─░sterseniz @{ -1} daha ├Ânce kontrol etti─činiz ┼čubeyi - yerine yazabilirsiniz oldbranch ).


Teknik a├ž─▒klama

git rebase ─░lk ├Ârnekten sonra neden 3 komisyon at─▒l─▒r? Bunun nedeni git rebase , hi├žbir arg├╝man olmad─▒─č─▒nda --fork-point , varsay─▒lan olarak zorlan─▒r; bu, yukar─▒ ak─▒┼č dal─▒n─▒n zorla itilmesine kar┼č─▒ sa─člam olmaya ├žal─▒┼čmak i├žin yerel reflog'u kullan─▒r.

M1, M2, M3 taahh├╝tlerini i├žerdi─činde men┼če / ustadan ayr─▒ld─▒─č─▒n─▒z─▒ ve ard─▒ndan ├╝├ž tane taahh├╝t verdi─činizi varsayal─▒m:

 M1--M2--M3  <-- origin/master
         \
          T1--T2--T3  <-- topic
 

fakat sonra birisi M2'yi ├ž─▒karmak i├žin zorla orijini / ustay─▒ zorlayarak tarihini yeniden yazar:

 M1--M3'  <-- origin/master
 \
  M2--M3--T1--T2--T3  <-- topic
 

Yerel reflogunuzu kullanarak git rebase , men┼če / ana dal─▒n daha ├Ânceki bir enkarnasyonundan ayr─▒ld─▒─č─▒n─▒z─▒ ve dolay─▒s─▒yla M2 ve M3'├╝n taahh├╝t etti─činiz konunun ger├žekten bir par├žas─▒ olmad─▒─č─▒n─▒ g├Ârebilirsiniz. Bu nedenle, M2'nin yukar─▒ ak─▒┼č dal─▒ndan kald─▒r─▒lmas─▒ndan bu yana, konu dal─▒n─▒n yeniden do─čurulmas─▒ndan sonra art─▒k konu dal─▒n─▒zda olmas─▒n─▒ istemedi─činizi varsayal─▒m:

 M1--M3'  <-- origin/master
     \
      T1'--T2'--T3'  <-- topic (rebased)
 

Bu davran─▒┼č mant─▒kl─▒ ve genellikle yeniden do─ču┼č s─▒ras─▒nda yap─▒lacak do─čru ┼čey.

Bu nedenle, a┼ča─č─▒daki komutlar─▒n ba┼čar─▒s─▒z olmas─▒n─▒n nedeni:

 git branch -t newbranch
git reset --hard HEAD~3
git checkout newbranch
 

ReflogÔÇÖu yanl─▒┼č durumda b─▒rakt─▒klar─▒ i├žin. Git newbranch 3 komisyonu i├žeren bir revizyonda yukar─▒ ak─▒┼č dal─▒ndan ├žatallanm─▒┼č olarak g├Âr├╝r , sonra komisyonlar─▒ ├ž─▒karmak i├žin yukar─▒ reset --hard ak─▒┼č tarihinin tarihini yeniden yazar ve b├Âylece bir sonraki ├žal─▒┼čt─▒rd─▒─č─▒n─▒zda git rebase onlar─▒ yukar─▒ ak─▒┼čtan kald─▒r─▒lm─▒┼č di─čer herhangi bir taahh├╝t gibi atars─▒n─▒z.

Ancak bu ├Âzel durumda, bu 3 taahh├╝d├╝n konu dal─▒n─▒n bir par├žas─▒ olarak de─čerlendirilmesini istiyoruz. Bunu ba┼čarabilmek i├žin, 3 taahh├╝d├╝ i├žermeyen ├Ânceki revizyonda yukar─▒ havay─▒ doldurmam─▒z gerekiyor. Benim ├Ânerdi─čim ├ž├Âz├╝mlerin yapt─▒─č─▒ budur, bu y├╝zden ikisi de reflog'u do─čru durumda b─▒rak─▒r.

Daha fazla ayr─▒nt─▒ --fork-point i├žin git rebase ve git merge-base docs i├žindeki tan─▒mlara bak─▒n─▒z .


289







Git stash kullanarak ├žok daha basit bir ├ž├Âz├╝m

─░┼čte yanl─▒┼č ┼čubeye taahh├╝t etmek i├žin ├žok daha basit bir yakla┼č─▒m. master ├ť├ž hatal─▒ taahh├╝tte bulunan ┼čubeden ba┼člayarak :

 git reset HEAD~3
git stash
git checkout newbranch
git stash pop
 

Bu ne zaman kullan─▒lmal─▒?

  • As─▒l amac─▒n─▒z geri almaksa master
  • Dosya de─či┼čikliklerini korumak istiyorsun
  • Hatal─▒ taahh├╝tler ├╝zerindeki mesajlar─▒ umursam─▒yorsun.
  • Hen├╝z ittin
  • Bunun ezberlemesi kolay olsun istiyorsun
  • Ge├žici / yeni dallar, taahh├╝t karmalar─▒ bulmak ve kopyalamak ve di─čer ba┼č a─čr─▒lar─▒ gibi komplikasyonlar istemiyorsunuz

Bu ne yapar, sat─▒r numaras─▒na g├Âre

  1. Son ├╝├ž s├Âzle┼čmeyi (ve mesajlar─▒n─▒) geri al─▒r master , ancak t├╝m ├žal─▒┼čan dosyalar─▒ bozulmadan b─▒rak─▒r
  2. T├╝m ├žal─▒┼čma dosyas─▒n─▒ de─či┼čtirerek saklar, b├Âylece master ├žal─▒┼čma a─čac─▒n─▒ tam olarak HEAD ~ 3 durumuna getirir
  3. Mevcut bir ┼čubeye ge├žer newbranch
  4. Statshed de─či┼čiklikleri ├žal─▒┼čma dizininize uygular ve stash'─▒ siler

Art─▒k kullanabilir git add ve git commit her zamanki gibi. T├╝m yeni taahh├╝tler eklenecek newbranch .

Bu ne yapmaz

  • Rastgele ge├žici dallar─▒ a─čaca y─▒─čmadan b─▒rakmaz
  • Hatal─▒ taahh├╝t mesajlar─▒n─▒ korumaz, bu nedenle bu yeni ┼čartnameye yeni bir taahh├╝t mesaj─▒ eklemeniz gerekir.

Hedefleri

OP, hedefin de─či┼čiklikleri kaybetmeden "bu taahh├╝tler yap─▒lmadan ├Ânce ustay─▒ geri almak" oldu─čunu belirtti ve bu ├ž├Âz├╝m bunu yapt─▒.

Bunu en az─▒ndan haftada bir kez, master yerine yanl─▒┼čl─▒kla yeni bir taahh├╝tte bulundu─čumda yap─▒yorum develop . Genellikle, geri alma i┼člemine yaln─▒zca bir ba─čl─▒l─▒─č─▒m vard─▒r, bu durumda git reset HEAD^ sat─▒r 1'i kullanmak , yaln─▒zca bir i┼člemeyi geri almak i├žin daha basit bir yoldur.

Master'─▒n de─či┼čikliklerini yukar─▒ do─čru ittiyseniz, bunu yapma

Bu de─či┼čiklikleri ba┼čka biri yapm─▒┼č olabilir. Yerel y├Âneticinizi yaln─▒zca yeniden yazarsan─▒z, yukar─▒ do─čru bas─▒ld─▒─č─▒nda etkisi yoktur, ancak yeniden yaz─▒lm─▒┼č bir tarihi ortak ├žal─▒┼čanlara zorlamak ba┼č a─čr─▒s─▒na neden olabilir.


97


2018-05-01





Bu teknik anlamda onlar─▒ "hareket ettirmez" ama ayn─▒ etkiye sahiptir:

 A--B--C  (branch-foo)
 \    ^-- I wanted them here!
  \
   D--E--F--G  (branch-bar)
      ^--^--^-- Opps wrong branch!

While on branch-bar:
$ git reset --hard D # remember the SHAs for E, F, G (or E and G for a range)

A--B--C  (branch-foo)
 \
  \
   D-(E--F--G) detached
   ^-- (branch-bar)

Switch to branch-foo
$ git cherry-pick E..G

A--B--C--E'--F'--G' (branch-foo)
 \   E--F--G detached (This can be ignored)
  \ /
   D--H--I (branch-bar)

Now you won't need to worry about the detached branch because it is basically
like they are in the trash can waiting for the day it gets garbage collected.
Eventually some time in the far future it will look like:

A--B--C--E'--F'--G'--L--M--N--... (branch-foo)
 \
  \
   D--H--I--J--K--.... (branch-bar)
 

30







Bunu ge├žmi┼či yeniden yazmadan yapmak i├žin (yani, daha ├Ânce komisyonlar─▒ ittiyseniz):

 git checkout master
git revert <commitID(s)>
git checkout -b new-branch
git cherry-pick <commitID(s)>
 

Her iki dal daha sonra zorlanmadan itilebilir!


24







Sadece bu durum vard─▒:

 Branch one: A B C D E F     J   L M  
                       \ (Merge)
Branch two:             G I   K     N
 

Ben yapt─▒m:

 git branch newbranch 
git reset --hard HEAD~8 
git checkout newbranch
 

Bu taahh├╝d├╝n HEAD olacagini ummustum, fakat L baglanmak simdi ...

Tarihte do─čru yere indi─činizden emin olmak i├žin, s├Âz konusu hash ile ├žal─▒┼čmak daha kolayd─▒r.

 git branch newbranch 
git reset --hard #########
git checkout newbranch
 

13







Bundan nas─▒l gidebilirim

 A - B - C - D - E 
                |
                master
 

buna?

 A - B - C - D - E 
    |           |
    master      newbranch
 

─░ki komut ile

  • git ┼čube -m usta newbranch

vererek

 A - B - C - D - E 
                |
                newbranch
 

ve

  • git ┼čube ustas─▒ B

vererek

 A - B - C - D - E
    |           |
    master      newbranch
 

4


2019-05-16





1) T├╝m de─či┼čikliklerinizi new_branch'e ta┼č─▒yan yeni bir ┼čube olu┼čturun.

 git checkout -b new_branch
 

2) Sonra eski ┼čubeye geri d├Ân├╝n.

 git checkout master
 

3) Git rebase yapmak

 git rebase -i <short-hash-of-B-commit>
 

4) Ard─▒ndan a├ž─▒lan edit├Âr son 3 taahh├╝t bilgisini i├žerir.

 ...
pick <C's hash> C
pick <D's hash> D
pick <E's hash> E
...
 

5) De─či┼čim pick i├žin drop o 3 kaydedilmesini t├╝m. Sonra edit├Âr├╝ kaydedin ve kapat─▒n.

 ...
drop <C's hash> C
drop <D's hash> D
drop <E's hash> E
...
 

6) ┼×imdi son 3 taahh├╝t ge├žerli ┼čubeden ( master ) kald─▒r─▒ld─▒ . ┼×imdi ┼čubeye zorla bas─▒p ┼čubeden + ├Ânce ismini yaz─▒n─▒z .

 git push origin +master
 

2







E─čer t├╝m itilmemi┼č taahh├╝tlerinizi yeni bir ┼čubeye ta┼č─▒man─▒z gerekiyorsa,

  1. olu┼čturmak bir yeni bir ┼čube ak─▒m birinden: git branch new-branch-name

  2. itmek i├žin yeni ┼čube : git push origin new-branch-name

  3. d├Ânmek i├žin eski (mevcut) dal─▒n─▒ son itilmi┼č / stabil duruma: git reset --hard origin/old-branch-name

Baz─▒ insanlar da uygun olanlar─▒ kullanmalar─▒ upstreams yerine ba┼čkalar─▒na da sahiptir. origin upstream


1







Bunu yapabildi─čim sadece 3 basit ad─▒m.

1) size en son g├╝ncellemeyi taahh├╝t etmek istedi─činiz yeni ┼čubeyi olu┼čturun.

git branch <branch name>

2) Yeni ┼čubeye taahh├╝tte bulunmak i├žin Son Taahh├╝t Kimli─čini bulun.

git log

3) En son yap─▒lanlar listesinin en ├╝stte yer ald─▒─č─▒na dair bu ID numaras─▒n─▒ kopyalay─▒n. B├Âylece taahh├╝d├╝n├╝z├╝ bulabilirsiniz. Bunu ayr─▒ca mesajla da bulabilirsiniz.

git cherry-pick d34bcef232f6c...

Ayr─▒ca, bir miktar taahh├╝t kimli─či de sa─člayabilirsiniz.

git cherry-pick d34bcef...86d2aec

┼×imdi i┼čin bitti. Do─čru kimli─či ve do─čru dal─▒ se├žtiyseniz ba┼čar─▒l─▒ olursunuz. Yani bunu yapmadan ├Ânce dikkatli ol. ba┼čka bir sorun ortaya ├ž─▒kabilir.

┼×imdi kodunu zorlayabilirsin

git push


0



─░lgili yay─▒nlar


Git'teki en son yerel taahh├╝tleri nas─▒l geri alabilirim?

Varolan ve taahh├╝t edilmeyen i┼čleri Git'teki yeni bir ┼čubeye ta┼č─▒

En son taahh├╝t edilenler taraf─▒ndan sipari┼č edilen Git ┼čubelerinin listesini nas─▒l alabilirim?

Git: ─░ki dal─▒n en son ortak atalar─▒n─▒ bulun.

Git ┼čubeleri aras─▒ndaki farklar─▒ nas─▒l g├Ârebilirim?

Bir dosyay─▒ de─či┼čtiren en son git taahh├╝d├╝n├╝ nas─▒l bulabilirim?

Eclipse'de en son ba┼člat─▒lan program─▒ yeniden ├žal─▒┼čt─▒rmak i├žin bir k─▒sayol var m─▒?

Bash'deki en yeni X dosyalar─▒ hari├ž t├╝m├╝n├╝ sil

.NET kullanarak ve d├Âng├╝ olmadan en yeni dosyay─▒ bir dizinde nas─▒l bulabilirim?

Ge├žerli ┼čubedeki t├╝m de─či┼čikliklerim─▒ yap ve GitÔÇÖte yeni bir ┼čubeye ta┼č─▒

Etiketle ilgili di─čer sorular [git]


XML'yi Notepad++ ile nas─▒l formatlar─▒m?

Bir yap─▒c─▒da sanal ├╝ye ├ža─čr─▒s─▒

Verilen bir taahh├╝t i├žeren dallar─▒ nas─▒l listeleyebilirim?

Python'da bir listeyi nas─▒l tersine ├ževirebilirim?

ÔÇťB├╝y├╝k veriÔÇŁ ├žal─▒┼čmas─▒ pandalar kullanarak ak─▒yor

Bir nesnenin t├╝m ge├žerli ├Âzelliklerini ve de─čerlerini yazd─▒rmak i├žin yerle┼čik bir i┼člev var m─▒?

Java'da bir singleton deseni uygulamak i├žin etkili bir yol nedir? [kapal─▒]

VS2013'te referans say─▒lar─▒ nas─▒l gizlenir?

Birlikte ├žal─▒┼čma t├╝r├╝ g├Âm├╝l├╝ olamaz

JavaScript'te bo┼č de─čerleri nas─▒l kontrol edebilirim?