Squash, son X'i Git'i kullanarak bir araya getiriyor


Al─▒nan cevaba git


Son X taahh├╝tlerimi Git'i kullanarak bir taahh├╝tte nas─▒l ezebilirim?


3222









Cevap say─▒s─▒n─▒ say: 30






git rebase -i <after-this-commit> ─░kinci ve sonraki taahh├╝tnamelerde "se├žim" i kullan─▒n ve kullan─▒m k─▒lavuzunda a├ž─▒kland─▒─č─▒ gibi "squash" veya "fixup" ile de─či┼čtirin .

Bu ├Ârnekte, <after-this-commit> ya SHA1 karma ya da rebase komutu i├žin taahh├╝t edilen mevcut dal─▒n HEAD'inin g├Âreceli konumu. ├ľrne─čin, kullan─▒c─▒ ge├žmi┼čte mevcut HEAD'den 5 taahh├╝tte bulunmak isterse komut budur git rebase -i HEAD~5 .


1823







Bunu git rebase veya olmadan kolayca yapabilirsiniz git merge --squash . Bu ├Ârnekte, son 3 taahh├╝d├╝ ezece─čiz.

Yeni i┼čleme mesaj─▒n─▒ s─▒f─▒rdan yazmak isterseniz, bu yeterlidir:

 git reset --soft HEAD~3 &&
git commit
 

Yeni i┼člem mesaj─▒n─▒, mevcut i┼člem mesajlar─▒n─▒n bir birle┼čimiyle d├╝zenlemeye ba┼člamak istiyorsan─▒z (yani, bir se├žim / squash / squash /ÔÇŽ / squash git rebase -i komut listesinin neyle ba┼člad─▒─č─▒na benzer ┼čekilde), bu mesajlar─▒ ├ž─▒kartman─▒z ve onlar─▒ git commit :

 git reset --soft HEAD~3 && 
git commit --edit -m"$(git log --format=%B --reverse [email protected]{1})"
 

Bu iki y├Ântem de son ├╝├ž taahh├╝d├╝ ayn─▒ ┼čekilde tek bir yeni taahh├╝t haline getirmektedir. Yaz─▒l─▒m s─▒f─▒rlamas─▒, HEAD'in ezilmesi istemedi─činiz son taahh├╝de i┼čaret eder. Ne endekse ne de ├žal─▒┼čma a─čac─▒na yaz─▒l─▒m s─▒f─▒rlamas─▒ dokunulmaz, bu sayede indeks yeni i┼čleminiz i├žin istenen durumda kal─▒r (yani, ÔÇťatmak ├╝zere oldu─čunuz taahh├╝tlerden gelen t├╝m de─či┼čiklikleri zaten vard─▒r).


3455







Bunun git merge --squash i├žin biraz daha ┼č─▒k olan─▒ kullanabilirsiniz git rebase -i . Usta oldu─čunuzu ve son 12 taahh├╝d├╝ bir araya getirmek istedi─činizi varsayal─▒m.

UYARI: ├ľncelikle i┼činizi yapt─▒─č─▒n─▒zdan emin olun - git status temiz olup olmad─▒─č─▒na bak─▒n ( git reset --hard a┼čamal─▒ ve de─či┼čmemi┼č de─či┼čiklikleri ataca─č─▒ i├žin)

Sonra:

 # Reset the current branch to the commit just before the last 12:
git reset --hard HEAD~12

# [email protected]{1} is where the branch was just before the previous command.
# This command sets the state of the index to be as it would just
# after a merge from that commit:
git merge --squash [email protected]{1}

# Commit those squashed changes.  The commit message will be helpfully
# prepopulated with the commit messages of all the squashed commits:
git commit
 

─░├žin belgeler git merge --squash se├žene─či daha ayr─▒nt─▒l─▒ olarak a├ž─▒klar .


G├╝ncelleme: git reset --soft HEAD~12 && git commit Chris Johnsen'─▒n cevab─▒nda ├Ânerdi─či daha basit olan bu y├Ântemin tek ger├žek avantaj─▒, ezdi─činiz her i┼člem mesaj─▒yla ├Ânceden haz─▒rlanm─▒┼č bir onay mesaj─▒ alman─▒zd─▒r.


693







git reset M├╝mk├╝n oldu─čunca ka├ž─▒n─▒lmas─▒n─▒ ├Âneriyorum - ├Âzellikle Git-acemiler i├žin. Ger├žekten ├žok say─▒da taahh├╝t temelli bir i┼člemi otomatikle┼čtirmek zorunda olmad─▒─č─▒n─▒z s├╝rece , daha az egzotik bir yol var ...

  1. S─▒k─▒┼čacak olan taahh├╝tleri ├žal─▒┼čan bir ┼čubeye koyma (e─čer haz─▒r de─čilse) - bunun i├žin gitk kullan─▒n
  2. Hedef ┼čubeye g├Âz at─▒n (├Âr. 'Usta')
  3. git merge --squash (working branch name)
  4. git commit

Kabul mesaj─▒ squash temelinde haz─▒rlan─▒r.


200







Chris Johnsen'in cevab─▒na dayanarak ,

Bash'den global bir "squash" di─čer ad─▒ ekleyin: (veya Windows'ta Git Bash)

 git config --global alias.squash '!f(){ git reset --soft HEAD~${1} && git commit --edit -m"$(git log --format=%B --reverse [email protected]{1})"; };f'
 

... veya Windows Komut ─░stemi'ni kullanarak:

 git config --global alias.squash "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse [email protected]{1})\"; };f"
 


Sizin ~/.gitconfig ┼čimdi bu takma ad─▒ i├žermelidir:

 [alias]
    squash = "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse [email protected]{1})\"; };f"
 


Kullan─▒m─▒:

 git squash N
 

... N Dahil olan , son taahh├╝tleri otomatik olarak bir araya getirir .

Not: Elde edilen taahh├╝t mesaj─▒, s─▒rayla t├╝m ezilmi┼č taahh├╝tlerin bir birle┼čimidir. Bundan memnun de─čilseniz, git commit --amend el ile istedi─činiz zaman de─či┼čtirebilirsiniz. (Veya, di─čer adlar─▒n─▒z─▒ zevklerinize uyacak ┼čekilde d├╝zenleyin.)


124







Bu kullan─▒┼čl─▒ blog yaz─▒s─▒ sayesinde, bu komutu son 3 ├žal─▒┼čmay─▒ ezmek i├žin kullanabilece─činizi ├Â─črendim:

 git rebase -i HEAD~3
 

Bu, izleme bilgisi / uzaktan repo olmadan yerel bir ┼čubedeyken bile ├žal─▒┼čt─▒─č─▒ i├žin kullan─▒┼čl─▒d─▒r.

Komut etkile┼čimli yeniden d├╝zenleme d├╝zenleyicisini a├žar ve ard─▒ndan normal ┼čekilde yeniden s─▒ralaman─▒za, ezmenize, yeniden s─▒ralaman─▒za vb. ─░zin verir.


Etkile┼čimli rebase edit├Âr├╝n├╝ kullanarak:

Etkile┼čimli rebase edit├Âr├╝ son ├╝├ž komisyonu g├Âsterir. Bu k─▒s─▒tlama, HEAD~3 komutu ├žal─▒┼čt─▒r─▒rken belirlendi git rebase -i HEAD~3 .

En son taahh├╝t,, HEAD ilk sat─▒r 1'de g├Âsterilmektedir. ─░le ba┼člayan sat─▒rlar # yorum / dok├╝mantasyondur.

G├Âr├╝nt├╝lenen belgeler olduk├ža a├ž─▒k. Herhangi bir sat─▒rda komutu, pick istedi─činiz bir komutla de─či┼čtirebilirsiniz .

fixup Bu komutu , s├Âz konusu taahh├╝d├╝n yukar─▒daki sat─▒rda yap─▒lan s├Âzle┼čmedeki de─či┼čikliklerini "bast─▒rmas─▒" ve s├Âz konusu mesaj─▒ iletmedi─či i├žin kullanmay─▒ tercih ediyorum .

1. sat─▒rdaki taahh├╝t gibi, HEAD ├žo─ču durumda bunu oldu─ču gibi b─▒rakacaks─▒n─▒z pick . Sen kullanamaz squash veya fixup olmad─▒─č─▒ i├žin ba┼čka i├žine i┼člemek ezmek i├žin taahh├╝t.


etkile┼čimli rebase edit├Âr├╝


102







TortoiseGit kullan─▒yorsan─▒z, a┼ča─č─▒dakileri yapabilirsiniz Combine to one commit :

  1. TortoiseGit i├žerik men├╝s├╝n├╝ a├ž
  2. se├žmek Show Log
  3. ─░lgili taahh├╝tleri g├╝nl├╝k g├Âr├╝n├╝m├╝nde i┼čaretleyin
  4. Se├ž Combine to one commit ba─člam men├╝s├╝nden


Birle┼čtirme taahh├╝tleri

Bu fonksiyon gerekli t├╝m tek git ad─▒mlar─▒n─▒ otomatik olarak y├╝r├╝t├╝r. Maalesef sadece Windows i├žin ge├žerli.


55







Bu makaleye dayanarak, bu y├Ântemi usecase i├žin daha kolay buldum.

Benim 'dev' ┼čubem 96 komisyon taraf─▒ndan 'k├Âkenli / dev' ├Ân├╝nde idi (bu y├╝zden bu komisyonlar hen├╝z uzaktan kumandaya al─▒nmad─▒).

De─či┼čimi zorlamadan ├Ânce bu taahh├╝tleri bir araya getirmek istedim. ┼×ubeyi 'ba┼člang─▒├ž ÔÇőÔÇő/ dev' durumuna getirmeyi tercih ediyorum (bu, 96 de─či┼čiklikten sonraki t├╝m de─či┼čiklikleri etiketsiz b─▒rakacak) ve ard─▒ndan de─či┼čiklikleri bir seferde kabul ediyorum:

 git reset origin/dev
git add --all
git commit -m 'my commit message'
 

44







Bunu yapmak i├žin git komutunu kullanabilirsiniz.

  git rebase -i HEAD~n
 

n (= 4 burada) son i┼člemin say─▒s─▒d─▒r. O zaman se├ženekleri takip ettin.

 pick 01d1124 Message....
pick 6340aaa Message....
pick ebfd367 Message....
pick 30e0ccb Message....
 

K├Âr├╝k gibi g├╝ncelleme,

 p 01d1124 Message....
s 6340aaa Message....
s ebfd367 Message....
s 30e0ccb Message....
 

Detaylar i├žin t─▒klay─▒n Ba─člant─▒

─░yi ┼čanslar!!


40







Dalda taahh├╝tleri birle┼čtirmek istedi─činiz dalda, ├žal─▒┼čt─▒r─▒n:

 git rebase -i HEAD~(n number of commits back to review)
 

├Ârnek:

 git rebase -i HEAD~1
 

Bu, metin edit├Âr├╝n├╝ a├žacakt─▒r ve bu taahh├╝tlerin bir araya getirilmesini istiyorsan─▒z, 'squash' ile yapt─▒─č─▒n─▒z her i┼člemin ├Ân├╝nde 'se├žimini' yapman─▒z gerekir. Belgelere g├Âre:

p, pick = kullan─▒m taahh├╝d├╝

s, squash = kullan─▒m taahh├╝d├╝, ancak ├Ânceki taahh├╝d├╝n├╝z├╝ de─či┼čtir

├ľrne─čin, t├╝m taahh├╝tleri bir araya getirmeyi d├╝┼č├╝n├╝yorsan─▒z, 'se├žim' yapt─▒─č─▒n─▒z ilk i┼člemdir ve gelecekteki t├╝m i┼čler (ilk s─▒ran─▒n alt─▒na yerle┼čtirilir) 'squash' olarak ayarlanmal─▒d─▒r. Vim kullan─▒yorsan─▒z , edit├Ârden kaydedip ├ž─▒kmak i├žin : x ekleme modunda kullan─▒n.

Ard─▒ndan yeniden y├╝klemeye devam etmek i├žin:

 git rebase --continue
 

Bu konuda daha fazla ┼čey ve taahh├╝t ge├žmi┼činizi yeniden yazmak i├žin bu yararl─▒ yaz─▒ya bak─▒n.


38







Anomies'in cevab─▒ iyi, ama bu konuda kendimi g├╝vensiz hissettim, bu y├╝zden birka├ž ekran g├Âr├╝nt├╝s├╝ eklemeye karar verdim.

Ad─▒m 0: Git g├╝nl├╝─č├╝

Nerede oldu─čunu g├Âr git log . En ├Ânemlisi, ├Âncelikle taahh├╝t karmas─▒n─▒ taahh├╝t bulmak yok kabak istiyorum. Yani sadece:


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin

Ad─▒m 1: git rebase

git rebase -i [your hash] Benim durumumda y├╝r├╝t├╝n :

 $ git rebase -i 2d23ea524936e612fae1ac63c95b705db44d937d
 

Ad─▒m 2: ─░stedi─činizi se├žin / ezin

Benim durumumda, her ┼čeyden ├Ânce zaman─▒nda olan emriyle ezmek istiyorum. S─▒ralama ilk ba┼čtan sona, yani tam olarak oldu─ču gibi git log . Benim durumumda istiyorum ki:


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin

Ad─▒m 3: Mesajlar─▒ ayarlay─▒n

Yaln─▒zca bir taahh├╝t se├žtiyseniz ve geri kalan─▒n─▒ ezdiyseniz, bir olu┼čturma iletisini ayarlayabilirsiniz:


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin

Bu kadar. Bunu kaydettikten sonra ( :wq ), bitirdiniz. ┼×una bir bak git log .


31







1) Taahh├╝t k─▒sa karmas─▒n─▒ tan─▒mlay─▒n

 # git log --pretty=oneline --abbrev-commit
abcd1234 Update to Fix for issue B
cdababcd Fix issue B
deab3412 Fix issue A
....
 

Burada bile git log --oneline k─▒sa hash elde etmek i├žin kullan─▒labilir.

2) Ezmek (birle┼čtirmek) istiyorsan─▒z son iki taahh├╝t

 # git rebase -i deab3412 
 

3) Bu nano birle┼čme i├žin bir edit├Âr a├žar . Ve a┼ča─č─▒daki gibi g├Âr├╝n├╝yor

 ....
pick cdababcd Fix issue B
pick abcd1234 Update to Fix for issue B
....
 

4) kelimesi yeniden adland─▒r pick i├žin squash daha ├Ânce mevcut olan abcd1234 . Yeniden adland─▒rd─▒ktan sonra a┼ča─č─▒daki gibi olmal─▒d─▒r.

 ....
pick cdababcd Fix issue B
squash abcd1234 Update to Fix for issue B
....
 

5) ┼×imdi nano edit├Âr├╝ kaydedin ve kapat─▒n . Kaydetmek i├žin tu┼čuna ctrl + o ve tu┼čuna bas─▒n Enter . Sonra ctrl + x edit├Ârden ├ž─▒kmak i├žin tu┼čuna bas─▒n .

6) Ard─▒ndan nano , g├╝ncellemeleri gerekirse, yorumlar─▒ g├╝ncellemek i├žin tekrar edit├Âr a├ž─▒l─▒r.

7) ┼×imdi ba┼čar─▒yla ezildi, g├╝nl├╝kleri kontrol ederek do─črulayabilirsiniz.

 # git log --pretty=oneline --abbrev-commit
1122abcd Fix issue B
deab3412 Fix issue A
....
 

8) ┼×imdi depoya bast─▒r─▒n. + ┼×ube ad─▒ndan ├Ânce i┼čaret eklemek i├žin not . Bu zorla itme anlam─▒na gelir.

 # git push origin +master
 

Not: Bu, shell'de git kullan─▒lmas─▒na dayan─▒r ubuntu . E─čer farkl─▒ os ( Windows veya Mac ) kullan─▒yorsan─▒z, yukar─▒daki komutlar edit├Âr hari├ž ayn─▒d─▒r. Farkl─▒ bir edit├Âr olabilir.


29







E─čer feature-branch bir Golden Repository'den ( golden_repo_name ) klonlanm─▒┼č uzak bir dalda isimlendiriliyorsan─▒z , i┼čte o zaman taahh├╝tlerinizi birebir birle┼čtirme tekni─či:

  1. Alt─▒n depoyu sat─▒n alma

     git checkout golden_repo_name
     
  2. Ondan yeni bir ┼čube olu┼čturun (alt─▒n repo) a┼ča─č─▒daki gibi

     git checkout -b dev-branch
     
  3. Squash, yerel ┼čubenizde daha ├Ânce bulundu─čunuz birle┼čme

     git merge --squash feature-branch
     
  4. De─či┼čikliklerinizi kabul edin (dev dal─▒na giren tek taahh├╝t bu olacakt─▒r)

     git commit -m "My feature complete"
     
  5. ┼×ubeyi yerel deponuza itin

     git push origin dev-branch
     

26







Ne ger├žekten uygun olabilir:
├╝st├╝ne ezmek istedi─činiz kesin karma┼čay─▒ bulun, diyelim d43e15 .

┼×imdi kullan

 git reset d43e15
git commit -am 'new commit name'
 

18







Son 10 taahh├╝d├╝ ezmek i├žin tek bir taahh├╝tte bulunun:

 git reset --soft HEAD~10 && git commit -m "squashed commit"
 

Ayr─▒ca, uzak dal─▒ ezilmi┼č taahh├╝tle g├╝ncellemek istiyorsan─▒z:

 git push -f
 

17


2018-08-21





Bu s├╝per kand─▒r─▒c─▒ ┼čey, ama bir nevi haval─▒ bir ┼čekilde, ben de onu y├╝z├╝─če ataca─č─▒m:

 GIT_EDITOR='f() { if [ "$(basename $1)" = "git-rebase-todo" ]; then sed -i "2,\$s/pick/squash/" $1; else vim $1; fi }; f' git rebase -i foo~5 foo
 

Terc├╝me: d├╝zenlenecek dosya ad─▒ git-rebase-todo (etkile┼čimli yeniden d├╝zenleme istemi ise) ilk "se├žim" i "squash" olarak de─či┼čtiren ve aksi takdirde istendi─činde ortaya ├ž─▒kacak olan "git" i├žin yeni bir "edit├Âr" sa─člay─▒n ezilmi┼č taahh├╝t mesaj─▒n─▒ d├╝zenlemek i├žin, vim olsun. (Ve tabii ki son be┼č komisyonu da ┼čube foo'yu eziyordum, fakat siz istedi─činiz ┼čekilde de─či┼čtirebilirsiniz.)

Muhtemelen Mark Longair'in ├Ânerdi─či ┼čeyi yapard─▒m .


16







Her bir taahh├╝d├╝ tek bir taahh├╝de ezmek istiyorsan─▒z (├Ârne─čin, bir projeyi ilk defa halka a├ž─▒klarken), ┼čunlar─▒ deneyin:

 git checkout --orphan <new-branch>
git commit
 

14







Bence bunu yapman─▒n en kolay yolunun ana daldan yeni bir ┼čube yapmas─▒ ve ├Âzellik dal─▒n─▒n bir birle┼čtirme - y─▒kamas─▒ yapmak oldu─čunu d├╝┼č├╝n├╝yorum.

 git checkout master
git checkout -b feature_branch_squashed
git merge --squash feature_branch
 

O zaman t├╝m de─či┼čiklikleri yapmaya haz─▒rs─▒n─▒z.


12







├ľrne─čin, son 3 taahh├╝d├╝ bir dalda (uzak havuzda) tek bir i┼člemeye tabi tutmak istiyorsan─▒z, ├Ârne─čin: https://bitbucket.org

Yapt─▒─č─▒m ┼čey

  1. git reset - soft Head ~ 3 &&
  2. git taahh├╝t
  3. git push k├Âkeni (dal_ad─▒) --force

11







┼×u anda ezmek istedi─činiz dalda oldu─čunuzu g├Âz ├Ân├╝nde bulundurarak, her zaman i┼če yarayan basit bir astar, usta kaynakland─▒─č─▒ dald─▒r ve en son s├Âz verme kullanmak istedi─činiz taahh├╝t mesaj─▒n─▒ ve yazar─▒ i├žerir:

 git reset --soft $(git merge-base HEAD master) && git commit [email protected]{1}
 

9







WAR´ŞĆ UYARI: "Son X'in taahh├╝t etti─či" belirsiz olabilir.

   (MASTER)  
Fleetwood Mac            Fritz
      ÔĽĹ                    ÔĽĹ
  Add Danny  Lindsey     Stevie       
    Kirwan  Buckingham    Nicks                                              
      ÔĽĹ         ÔĽÜÔĽÉÔĽÉÔĽÉÔĽŽÔĽÉÔĽÉÔĽÉÔĽÉÔĽÉÔĽÉÔĽŁ     
Add Christine       ÔĽĹ          
   Perfect      Buckingham
      ÔĽĹ           Nicks            
    LA1974ÔĽÉÔĽÉÔĽÉÔĽÉÔĽÉÔĽÉÔĽÉÔĽÉÔĽÉÔĽÉÔĽŁ                                    
      ÔĽĹ                  
      ÔĽĹ                  
    Bill <ÔĽÉÔĽÉÔĽÉÔĽÉÔĽÉÔĽÉ YOU ARE EDITING HERE
  Clinton        (CHECKED OUT, CURRENT WORKING DIRECTORY)              
 

Https://github.com/fleetwood-mac/band-history deposunun bu ├žok k─▒salt─▒lm─▒┼č tarihinde , Bill Clinton'da orijinal ( MASTER ) Fleetwood Mac taahh├╝d├╝n├╝n taahh├╝d├╝nde bulunan Bill Clinton'da birle┼čtirmek i├žin bir ├žekme iste─či a├žt─▒n─▒z.

Bir ├žekme iste─či a├žt─▒n─▒z ve GitHubÔÇÖda ┼čunu g├Âr├╝yorsunuz:

D├Ârt taahh├╝t:

  • Danny Kirwan ekle
  • Christine M├╝kemmel ekle
  • LA1974
  • Bill Clinton

Hi├ž kimsenin depo tarihinin tamam─▒n─▒ okumay─▒ umursamayaca─č─▒n─▒ d├╝┼č├╝n├╝yorum. (Asl─▒nda bir depo var, yukar─▒daki ba─člant─▒y─▒ t─▒klay─▒n!) Bu taahh├╝tleri ezmeye karar verdiniz. Yani git ve ko┼č git reset --soft HEAD~4 && git commit . O zaman git push --force PR'─▒n─▒z─▒ temizlemek i├žin GitHub'a gidersiniz.

Ve ne oldu? Fritz'den Bill Clinton'a kadar tek bir taahh├╝tte bulundun. ├ç├╝nk├╝ d├╝n, bu projenin Buckingham Nickleri versiyonunda ├žal─▒┼čt─▒─č─▒n─▒ unuttun. Ve git log GitHub'da g├Ârd├╝klerinizle e┼čle┼čmiyor.

? H─░KAYE SINIRI

  1. ─░stedi─činiz tam dosyalar─▒ ve git checkout onlar─▒ bulun.
  2. Kesin ├Ânce tarihin tutmak istiyorum taahh├╝t bulun ve git reset --soft o
  3. Bir git commit ├ž├Âzg├╝ do─črudan ├╝zerinden ba┼člayarak bir yapmak

8







Komisyonlar aras─▒ndaki taahh├╝t mesajlar─▒n─▒ ├Ânemsemiyorsan─▒z, kullanabilirsiniz.

 git reset --mixed <commit-hash-into-which-you-want-to-squash>
git commit -a --amend
 

7







S├Âz konusu, "son" ile ne kastedildi─či belirsiz olabilir.

├Ârne─čin git log --graph a┼ča─č─▒dakileri ├ž─▒kar─▒r (basitle┼čtirilmi┼č):

 * commit H0
|
* merge
|\
| * commit B0
| |
| * commit B1
| | 
* | commit H1
| |
* | commit H2
|/
|
 

O zaman en son taahh├╝t edilenler H0, birle┼čtirme, B0. Onlar─▒ ezmek i├žin birle┼čtirilmi┼č ┼čubenizi yeniden i┼člemelisiniz, H1.

Buradaki sorun, H0'─▒n H1 ve H2 i├žermesi (ve genellikle birle┼čtirme ├Âncesi ve dallanma sonras─▒ daha fazla taahh├╝tte bulunmas─▒) iken B0 de─čildir. Yani en az─▒ndan H0, birle┼čtirme, H1, H2, B0 de─či┼čikliklerini y├Ânetmelisiniz.

Rebase'i kullanmak ancak farkl─▒ ┼čekillerde kullanmak m├╝mk├╝nd├╝r, daha sonra belirtilen cevaplarda:

rebase -i HEAD~2

Bu size se├žim se├ženeklerini g├Âsterecektir (di─čer cevaplarda belirtildi─či gibi):

 pick B1
pick B0
pick H0
 

H0 yerine pick up yerine squash koyun:

 pick B1
pick B0
s H0
 

Kaydet ve ├ž─▒kt─▒ktan sonra rebase, H1'den sonra s─▒rayla taahh├╝t eder. Bu, sizden tekrar ├žat─▒┼čmalar─▒ ├ž├Âzmenizi isteyece─či anlam─▒na gelir (ilk ├Ânce HEAD H1 olacak ve daha sonra uyguland─▒klar─▒ ┼čekilde taahh├╝tte bulunacaklar).

Rebase bittikten sonra, H0 ve B0 ezilmi┼č i├žin mesaj─▒ se├žebilirsiniz:

 * commit squashed H0 and B0
|
* commit B1
| 
* commit H1
|
* commit H2
|
 

PS BO'ya sadece baz─▒ s─▒f─▒rlamalar yaparsan─▒z: (├Ârne─čin, reset --mixed bunun kullan─▒m─▒ daha ayr─▒nt─▒l─▒ olarak burada a├ž─▒klanm─▒┼čt─▒r https://stackoverflow.com/a/18690845/2405850 ):

 git reset --mixed hash_of_commit_B0
git add .
git commit -m 'some commit message'
 

daha sonra H0, H1, H2'nin B0 de─či┼čikliklerine girersiniz (kaybetmek dallanma sonras─▒ ve birle┼čmeden ├Ânce de─či┼čiklikler i├žin tamamen taahh├╝t eder.


5







Bunun gibi bir i┼č ak─▒┼č─▒yla ilgili sorunun cevab─▒na ne dersiniz?

  1. master'dan ├žoklu birle┼čme ile kar─▒┼č─▒k bir├žok yerel komisyon ,
  2. Sonunda uzaktan kumandaya basmak,
  3. PR ve inceleyen taraf─▒ndan usta birle┼čtirmek . (Evet, geli┼čtirici i├žin merge --squash PR'dan sonra daha kolay olurdu , ancak tak─▒m s├╝reci yava┼člataca─č─▒n─▒ d├╝┼č├╝n├╝yordu.)

Bu sayfada b├Âyle bir i┼č ak─▒┼č─▒ g├Ârmedim. (Bu benim g├Âzlerim olabilir.) E─čer rebase do─čru anlarsam, ├žoklu birle┼čme ├žoklu ├žat─▒┼čma kararlar─▒ gerektirir . Bunun hakk─▒nda d├╝┼č├╝nmek bile istemiyorum!

Yani, bu bizim i├žin ├žal─▒┼č─▒yor gibi g├Âr├╝n├╝yor.

  1. git pull master
  2. git checkout -b new-branch
  3. git checkout -b new-branch-temp
  4. yerel olarak d├╝zenleme yap─▒n ve ├žok i┼č yap─▒n, master'─▒ d├╝zenli olarak birle┼čtirin
  5. git checkout new-branch
  6. git merge --squash new-branch-temp // t├╝m de─či┼čiklikleri sahneye koyar
  7. git commit 'one message to rule them all'
  8. git push
  9. Hakem, PR yapar ve ustala┼čmak i├žin birle┼čir.

5







Ben daha genel bir ├ž├Âz├╝m buluyorum 'N' taahh├╝tlerini belirtmek de─čil, ├╝st├╝ne ezmek istedi─činiz dal / taahh├╝t kimli─čini belirtmek. Bu, belirli bir taahh├╝tte bulunan taahh├╝tleri saymaktan daha az hataya meyillidir - sadece etiketi do─črudan belirtin veya ger├žekten saymak istiyorsan─▒z HEAD ~ N belirtebilirsiniz.

─░┼č ak─▒┼č─▒mda bir ┼čubeye ba┼čl─▒yorum ve bu ┼čubeye olan ilk ba─čl─▒l─▒─č─▒m hedefi ├Âzetliyor (yani, bu ├Âzellik i├žin genel veri havuzuna 'nihai' mesaj olarak itece─čim.) Yapmak istedi─čim git squash master ilk mesaja geri d├Ânece─čim ve sonra itmeye haz─▒r─▒m.

Takma ad─▒ kullan─▒yorum:

 squash = !EDITOR="\"_() { sed -n 's/^pick //p' \"\\$1\"; sed -i .tmp '2,\\$s/^pick/f/' \"\\$1\"; }; _\"" git rebase -i
 

Bu, ├Âyk├╝s├╝n├╝ ondan ├Ânce ezilmi┼č olarak b─▒rakacakt─▒r - bu, geri almak isterseniz eski bir i┼člem kimli─čini konsoldan alarak kurtarma ┼čans─▒ verir. (Solaris kullan─▒c─▒lar─▒, GNU sed -i se├žene─čini kulland─▒─č─▒n─▒ , Mac ve Linux kullan─▒c─▒lar─▒n─▒n bu konuda iyi olmas─▒ gerekti─čini belirtti.)


4







 git rebase -i HEAD^^
 

^ 'nin say─▒s─▒ X olan

(Bu durumda, son iki taahh├╝d├╝ ezmek)


4







Di─čer m├╝kemmel cevaplara ek olarak, git rebase -i beni her zaman taahh├╝t emriyle ne kadar kar─▒┼čt─▒rd─▒─č─▒n─▒ da eklemek isterim - yenisinden daha eski mi yoksa tam tersi mi? Yani bu benim i┼č ak─▒┼č─▒m:

  1. git rebase -i HEAD~[N] burada N, en sonuncusundan ba┼člayarak, kat─▒lmak istedi─čim taahh├╝tlerin say─▒s─▒ . Yani git rebase -i HEAD~5 , "son 5 taahh├╝d├╝ yenisiyle birle┼čtir";
  2. Edit├Âr a├ž─▒l─▒r, birle┼čtirmek istedi─čim taahh├╝tlerin listesini g├Âsterir. ┼×imdi ters s─▒rada g├Âr├╝nt├╝lenirler : eski i┼člem en ├╝sttedir. "Kabak" veya "s" olarak i┼čaretleyiniz , ilk / eski olan hari├ž t├╝m komisyonlar─▒ : ba┼člang─▒├ž ÔÇőÔÇőnoktas─▒ olarak kullan─▒lacakt─▒r. D├╝zenleyiciyi kaydedin ve kapat─▒n;
  3. Edit├Âr, yeni taahh├╝t i├žin varsay─▒lan bir mesajla tekrar a├ž─▒l─▒r: istedi─činiz ┼čekilde de─či┼čtirin, kaydedin ve kapat─▒n. Squash tamamland─▒!

Kaynaklar ve ek okumalar: # 1 , # 2 .


4







GitLab ile ├žal─▒┼č─▒yorsan─▒z, Birle┼čtirme ─░ste─čindeki Squash se├žene─čini a┼ča─č─▒da g├Âsterildi─či gibi t─▒klaman─▒z yeterlidir. Onay mesaj─▒, Birle┼čtirme ─░ste─činin ad─▒ olacak.


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin


3







├ľncelikle, ├Âzellik dal─▒m ile mevcut ana dal─▒m aras─▒ndaki i┼člem say─▒s─▒n─▒

 git checkout master
git rev-list master.. --count
 

Ard─▒ndan, ├Âzellik dal─▒mdan yola ├ž─▒karak ba┼čka bir dal olu┼čturuyorum, my-feature dal─▒ dokunmadan tutuyorum.

Son olarak ko┼čtum

 git checkout my-feature
git checkout -b my-rebased-feature
git checkout master
git checkout my-rebased-feature
git rebase master
git rebase head^x -i
// fixup/pick/rewrite
git push origin my-rebased-feature -f // force, if my-rebased-feature was ever pushed, otherwise no need for -f flag
// make a PR with clean history, delete both my-feature and my-rebased-feature after merge
 

Umar─▒m yard─▒mc─▒ olur, te┼čekk├╝rler.


2







GitUp kullan─▒yorsan─▒z, ├╝st ├Â─čeyle birle┼čtirmek istedi─činiz taahh├╝d├╝ se├žin ve S tu┼čuna bas─▒n . Her i┼člem i├žin bir kez yapman─▒z gerekir, ancak do─čru komut sat─▒r─▒ geli┼čtirme ile gelmekten ├žok daha kolayd─▒r. ├ľzellikle de arada bir yapt─▒─č─▒n─▒z bir ┼čeyse.


1