Для простого примера, скажем, у нас есть репо, в котором в файл была добавлена неправильная строка a
.
$ git init
Initialized empty Git repository in /someplace/.git/
$ echo "a1\nb2" > a
$ echo b1 > b
$ git add .
$ git commit -m init
[master (root-commit) 917f3b9] init
2 files changed, 3 insertions(+)
create mode 100644 a
create mode 100644 b
Ветвь master
, затем разветвляется на новую ветвь f
.
$ git branch f
В master
мы добавляем еще одну строку в неверный файл.
$ echo b3 >> a
$ git commit -am 'added b3 to a'
[master e44bc9f] added b3 to a
1 file changed, 1 insertion(+)
В ветке f
мы делаем что-то не связанное, фиксируем это,
$ git checkout f
$ echo c1 > c
$ git add .
$ git commit -m "added c"
1 label onto
[f 7cb63b2] added c
1 file changed, 1 insertion(+)
create mode 100644 c
затем мы перемещаем строку, неправильно помещенную в файл a, в файл b.
$ echo b2 >> b
$ sed -i '/b2/d' a
$ git commit -am "moved b2 to where it really belongs"
[f 32cee76] moved b2 to where it really belongs
2 files changed, 1 insertion(+), 1 deletion(-)
Затем мы пытаемся объединить master
с f
, но столкнулись с конфликтом, который master
добавил еще одну неправильную строку, в то время как f
удалил первую.
$ git merge master
Auto-merging a
CONFLICT (content): Merge conflict in a
Automatic merge failed; fix conflicts and then commit the result.
$ cat a
a1
<<<<<<< HEAD
=======
b2
b3
>>>>>>> master
Чтобы разрешить конфликт, мы перемещаем вторую неправильную строку в правильный файл и фиксируем слияние.
$ echo b3 >> b
$ sed -i '/HEAD/,$d' a
$ git commit -a --no-edit
[f 28d8543] Merge branch 'master' into f
Затем мы понимаем, что коммит около c
не должен находиться в этой ветке, поэтому мы «удаляем» его с помощью rebase -ir
и встречаемся с тем же конфликтом, что и ранее.
$ git rebase -ir $(git merge-base master @) # remove the commit about c
Auto-merging a
CONFLICT (content): Merge conflict in a
Could not apply 28d8543... onto # Merge branch 'master' into f
$ cat a
a1
<<<<<<< HEAD
=======
b2
b3
>>>>>>> refs/rewritten/onto
Итак, какое самое простое, наиболее эффективное и универсальное решение здесь, чтобы восстановить предыдущее разрешение, принимая во внимание то, что было добавлено в b
, которое не появляется в конфликте?