З інших відповідей тут я був git rebase -i
дещо плутаний із тим, як можна було б скористатися для видалення комісії , тому сподіваюся, що це нормально, щоб записати тут мій тестовий випадок (дуже подібний до ОП).
Ось bash
сценарій, який можна вставити, щоб створити тестовий сховище у /tmp
папці:
set -x
rm -rf /tmp/myrepo*
cd /tmp
mkdir myrepo_git
cd myrepo_git
git init
git config user.name me
git config user.email me@myself.com
mkdir folder
echo aaaa >> folder/file.txt
git add folder/file.txt
git commit -m "1st git commit"
echo bbbb >> folder/file.txt
git add folder/file.txt
git commit -m "2nd git commit"
echo cccc >> folder/file.txt
git add folder/file.txt
git commit -m "3rd git commit"
echo dddd >> folder/file.txt
git add folder/file.txt
git commit -m "4th git commit"
echo eeee >> folder/file.txt
git add folder/file.txt
git commit -m "5th git commit"
На даний момент у нас є такий file.txt
вміст:
aaaa
bbbb
cccc
dddd
eeee
У цей момент HEAD знаходиться на 5-му фіксації, HEAD ~ 1 буде 4-м, а HEAD ~ 4 буде 1-м чином (тому HEAD ~ 5 не існував). Скажімо, ми хочемо видалити 3-й коміт - ми можемо випустити цю команду в myrepo_git
каталог:
git rebase -i HEAD~4
( Зауважте, що git rebase -i HEAD~5
результати з "фатальним: потрібна одноразова редакція; недійсна HEAD ~ 5". ) Текстовий редактор (див. Скріншот у відповіді @Dennis ) відкриється з цим вмістом:
pick 5978582 2nd git commit
pick 448c212 3rd git commit
pick b50213c 4th git commit
pick a9c8fa1 5th git commit
# Rebase b916e7f..a9c8fa1 onto b916e7f
# ...
Таким чином, ми отримуємо всі зобов’язання, оскільки (але не включаючи ) наш запитуваний HEAD ~ 4. Видаліть рядок pick 448c212 3rd git commit
і збережіть файл; Ви отримаєте цю відповідь від git rebase
:
error: could not apply b50213c... 4th git commit
When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".
Could not apply b50213c... 4th git commit
У цей момент відкрийте myrepo_git / folder/file.txt
у текстовому редакторі; ви побачите, що він був змінений:
aaaa
bbbb
<<<<<<< HEAD
=======
cccc
dddd
>>>>>>> b50213c... 4th git commit
В основному, git
бачить, що коли HEAD дістався до другої комісії, був вміст aaaa
+ bbbb
; а потім у нього доданий патч cccc
+, dddd
який він не знає, як додати до наявного вмісту.
Тому тут git
ви не можете вирішити - саме ви повинні прийняти рішення: видаливши 3-й коміт, ви або зберігаєте внесені ним зміни (тут, рядок cccc
) - або ви цього не робите. Якщо ви цього не зробите, просто видаліть зайві рядки, у тому числі cccc
- у folder/file.txt
текстовому редакторі, так що це виглядає так:
aaaa
bbbb
dddd
... а потім збережіть folder/file.txt
. Тепер ви можете задати наступні команди в myrepo_git
каталозі:
$ nano folder/file.txt # text editor - edit, save
$ git rebase --continue
folder/file.txt: needs merge
You must edit all merge conflicts and then
mark them as resolved using git add
Ах - так, щоб відзначити , що ми вирішили конфлікт, ми повинні , перш ніж робити :git add
folder/file.txt
git rebase --continue
$ git add folder/file.txt
$ git rebase --continue
Тут текстовий редактор знову відкривається, показуючи рядок 4th git commit
- тут ми маємо шанс змінити повідомлення про фіксацію (яке в цьому випадку може бути змістовно змінено на 4th (and removed 3rd) commit
або подібне). Скажімо, ви не хочете - тому просто вийдіть із текстового редактора без збереження; як тільки ви це зробите, ви отримаєте:
$ git rebase --continue
[detached HEAD b8275fc] 4th git commit
1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/master.
На даний момент тепер у вас є така історія (яку ви також можете ознайомитись із gitk .
програмою " Скажіть чи іншими інструментами") вмісту folder/file.txt
(з, мабуть, незмінними часовими позначками оригінальних комісій):
1st git commit | +aaaa
----------------------------------------------
2nd git commit | aaaa
| +bbbb
----------------------------------------------
4th git commit | aaaa
| bbbb
| +dddd
----------------------------------------------
5th git commit | aaaa
| bbbb
| dddd
| +eeee
І якби раніше ми вирішили зберегти рядок cccc
(вміст 3-го git-комітету, який ми видалили), у нас було б:
1st git commit | +aaaa
----------------------------------------------
2nd git commit | aaaa
| +bbbb
----------------------------------------------
4th git commit | aaaa
| bbbb
| +cccc
| +dddd
----------------------------------------------
5th git commit | aaaa
| bbbb
| cccc
| dddd
| +eeee
Що ж, саме таке читання я сподівався, що я знайду, щоб почати бачити, як git rebase
працює з точки зору видалення комітетів / змін; тож сподіваємось, що це може допомогти і іншим ...