Sunshine

Git冲突解决

git merge (冲突版)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mkdir mergeDemo
cd mergeDemo
git init
echo "1.c" > 1.c
git add 1.c
git ci -m "1.c by master"

git co -b test
echo "test" >> 1.c
git add 1.c
git ci -m "1.c modified by test"

git co master
echo "master" >> 1.c
git add 1.c
git ci -m "1.c modified by master"


git merge test

以上命令执行完之后,会遇到冲突。首先,通过vim打开冲突的文件,在这里是1.c,修改完冲突之后,wq保存退出;
接着,运行如下命令,完成后续操作

1
2
git add 1.c
git ci -m "fixed conflict"

git rebase (冲突版)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mkdir rebaseDemo
cd rebaseDemo
git init
echo "1.c" > 1.c
git add 1.c
git ci -m "1.c by master"

git co -b test
echo "test" >> 1.c
git add 1.c
git ci -m "1.c modified by test"

git co master
echo "master" >> 1.c
git add 1.c
git ci -m "1.c modified by master"

git rebase master test

以上命令执行完之后,会遇到冲突。首先,通过vim打开冲突的文件,在这里是1.c,修改完冲突之后,wq保存退出;
接着,运行如下命令,完成后续操作

1
2
3
4
git add 1.c
git rebase --continue
git co master
git merge test

git rebase -i

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mkdir rebase-i-demo
cd rebase-i-demo
git init
echo "1.c" > 1.c
git add 1.c
git ci -m "1.c by master"

git co -b test

echo "111" >> 1.c
git add 1.c
git ci -m "test 修改了 1.c 111"
echo "2x2" >> 1.c
git add 1.c
git ci -m "test 修改了 1.c 222"
echo "333" >> 1.c
git add 1.c
git ci -m "test 修改了 1.c 333"
echo "444" >> 1.c
git add 1.c
git ci -m "test 修改了 1.c 444"
echo "555" >> 1.c
git add 1.c
git ci -m "test 修改了 1.c 5xx"

执行完以上命令之后,我们模拟出了这样一个场景:在test分支上对1.c文件修改了5次。

第二次修改有误,本想修改为222,却误将其修改为了2x2,因此,对第二次修改需要更正(edit);

第三次修改和第四次修改希望想融合为一次提交log,但是内容都保留,因此,对第四次修改需要融合(squash);

第五次修改的提交log有误,本想提交为”test 修改了 1.c 555”,却误输入为”test 修改了 1.c 5xx”,因此,对第五次修改需要更新log(reword)

基于以上分析,假设这五次提交的commit号分别为 1abcdef 2abcdef 3abcdef 4abcdef 5abcdef,那需要进行如下操作

  1. 执行命令 git rebase -i master test
  2. 编辑以上命令执行完之后的文件为如下内容

    1
    2
    3
    4
    5
    p 1abcdef
    e 2abcdef
    p 3abcdef
    s 4abcdef
    r 5abcdef
  3. 编辑完之后,wq保存退出,后续步骤根据 git status的提醒,类似git rebase的操作继续操作即可

  4. git rebase -i master test命令的后续操作都完成之后,在执行如下两条命令即可

    1
    2
    git co master
    git merge test