Как да промените старите git ангажименти?

Направих 3 git ангажименти, но не беше кликнато. Как да смените стария (ddc6859af44) и (47175e84c), който не е последният?

 $git log commit f4074f289b8a49250b15a4f25ca4b46017454781 Date: Tue Jan 10 10:57:27 2012 -0800 commit ddc6859af448b8fd2e86dd0437c47b6014380a7f Date: Mon Jan 9 16:29:30 2012 -0800 commit 47175e84c2cb7e47520f7dde824718eae3624550 Date: Mon Jan 9 13:13:22 2012 -0800 
111
11 янв. определени от Майкъл 11 януари 2012-01-11 21:52 '12 в 21:52 2012-01-11 21:52
@ 6 отговора
 git rebase -i HEAD^^^ 

Сега отбележете тези, които искате да промените с edit или e (замени pick ). Сега запазете и излезте.

Сега направете промените

 git add -A git commit --amend --no-edit git rebase --continue 

Ако искате да добавите допълнително изтриване, премахнете параметрите от командата commit. Ако искате да персонализирате съобщението, пропуснете само параметъра --no-edit .

141
11 янв. отговорът е даден от Адам Димитрук на 11 януари. 2012-01-11 22:06 '12 в 22:06 ч. 2012-01-11 22:06

Подготвих моя ангажимент, който исках да направя с по-възрастен, и бях изненадан да видя, че rebase -i се оплака, че имам непроменени промени. Но не исках промените ми да показват отново редактиращия параметър на старшия ангажимент. По този начин решението беше съвсем просто и ясно:

  • подгответе актуализацията си за по-старата, добавете я и изпълнете
  • git rebase -i <commit you want to amend>^ - забележете ^ така че можете да видите определеното поправка в текстов редактор
  • Ще получите следното:

     pick 8c83e24 use substitution instead of separate subsystems file to avoid jgroups.xml and jgroups-e2.xml going out of sync pick 799ce28 generate ec2 configuration out of subsystems-ha.xml and subsystems-full-ha.xml to avoid discrepancies pick e23d23a fix indentation of jgroups.xml 
  • Сега, за да комбинирате e23d23a с 8c83e24, можете да промените реда на линиите и да използвате squash както следва:

     pick 8c83e24 use substitution instead of separate subsystems file to avoid jgroups.xml and jgroups-e2.xml going out of sync squash e23d23a fix indentation of jgroups.xml pick 799ce28 generate ec2 configuration out of subsystems-ha.xml and subsystems-full-ha.xml to avoid discrepancies 
  • напишете и излезете от файла, ще бъдете с редактора, за да комбинирате съобщенията за фиксиране. Направете това и запазете / излезте от текстовия документ.

  • Завършихте промените си.
border=0

Кредит отива на: http://git-scm.com/book/en/Git-Tools- Rewriting-History Има и полезна демонстрирана git магия.

75
09 авг. отговорът се дава от akostadinov 09 aug. 2013-08-09 18:42 '13 в 18:42 2013-08-09 18:42

Можете да използвате git rebase да презапишете историята на git rebase . Това може да бъде потенциално разрушително за вашите промени, така че използвайте с повишено внимание.

Първо направете промяната си „промяна” както обикновено. След това изпълнете интерактивно пренасочване, като започнете с родителя на стария си ангажимент

 git rebase -i 47175e84c2cb7e47520f7dde824718eae3624550^ 

Това ще стартира вашия редактор с всички фиксации. Променете поръчката, така че „фиксираното“ да се извърши под това, което искате да промените. След това заменете първата дума в реда с "commit" commit с s , която ще се слее с коммит по-рано. Запазете и излезте от редактора и следвайте инструкциите.

9
11 янв. Отговор, даден от Бенджамин Баниер на 11 януари 2012-01-11 21:55 '12 в 21:55 ч. 2012-01-11 21:55

Можете да използвате git rebase --interactive , като използвате командата git rebase --interactive , която искате да промените.

9
11 янв. отговорът е даден Ави 11 Ян. 2012-01-11 22:01 '12 в 10:01 ч. 2012-01-11 22:01

Използвах различен метод няколко пъти. Всъщност, това е git rebase -i за git rebase -i и е полезно, ако искате да пренаредите няколко коммита, включително смачкване или разделяне на някои от тях. Основното предимство е, че не е нужно да вземате решение за всяка съдба в един момент. Ще имате всички Git функции, налични по време на процеса, за разлика от по време на преинсталирането. Например, можете по всяко време да покажете дневник както на оригиналната, така и на презаписана история или дори да извършите друго рестартиране!

Ще се позовем на ангажименти, както следва, така че е лесно да се чете:

 C # good commit after a bad one B # bad commit A # good commit before a bad one 

Вашата история в началото е както следва:

 x - A - B - C | | | master | origin/master 

Ние го пресъздаваме по следния начин:

 x - A - B*- C' | | | master | origin/master 

Това е процедурата:

 git checkout B # get working-tree to the state of commit B git reset --soft A # tell git that we are working before commit B git checkout -b rewrite-history # switch to a new branch for our alternative history 

Подобрете стария си ангажимент с git add ( git add -i , git stash и др.). Можете дори да разделите старата си фиксация на две или повече.

 git commit # recreate commit B (result = B*) git cherry-pick C # copy C to our new branch (result = C') 

Междинен резултат:

 x - A - B - C | \ | | \ master | \ | B*- C' | | | rewrite-history | origin/master 

Нека свърши:

 git checkout master git reset --hard rewrite-history # make this branch master 

За да направите това, можете да push .

7
19 авг. Отговорът е даден от Мелебий 19 август. 2013-08-19 10:24 '13 в 10:24 ч. 2013-08-19 10:24

В случай, че операционната система иска да стисне 2 ангажименти, посочени в 1, тук е алтернативен начин да направите това, без да рестартирате

 git checkout HEAD^ # go to the first commit you want squashed git reset --soft HEAD^ # go to the second one but keep the tree and index the same git commit --amend -C HEAD@{1} # use the message from first commit (omit this to change) git checkout HEAD@{3} -- . # get the tree from the commit you did not want to touch git add -A # add everything git commit -C HEAD@{3} # commit again using the message from that commit 

Синтаксисът @{N) е удобен, тъй като ще ви позволи да препращате към историята на връзките. В този случай това е HEAD, която представлява текущия ви ангажимент.

2
11 янв. отговорът е даден от Адам Димитрук на 11 януари. 2012-01-11 23:52 '12 в 11:52 2012-01-11 23:52

Други въпроси относно тагове за или Задайте въпрос