I am having trouble getting git to do what I want in moderately complicated branching scenarios. It seems like some of my work is being lost whenever I use the rebase command. I am new to git, coming from a Perforce background. Am I using the wrong commands or missing some flags? Is my intuition about the internal state of my local repository correct?
Note: branchB is dependent on branchA, and branchC is dependent on branchB.
git checkout -b branchA
==O master \\==A branchA
git checkout -b branchB
==O==O master \\==A branchA \\==B branchB
git checkout -b branchC
==O==O==O==O master \\==A branchA \\==B branchB \\==C branchC
git merge branchA
==O==O==O==O==A master \\==B branchB <== is this correct? \\==C branchC
resolve merge conflicts
==O==O==O==O==A master \\ \\==B branchB \\==C branchC <== is this correct?
resolve merge conflicts <== often redo the same merge conflicts as branchB
==O==O==O==O==A master \\==B branchB \\==C branchC
git checkout -b refactorA
==O==O==O==O==A master |==A' refactorA |==B branchB \\==C branchC
resolve merge conflicts (three sets of conflicts)
==O==O==O==O==A master \\==A' refactorA \\ \\==B branchB <== is this correct? \\==C branchC
You need to understand that commits are dependents from the previous one and branches are just pointers to one commit of the commit graph.
Here is the commit graph evolution, numbers are commits, upper are newer, references and branches are aside commits, HEAD
is your current position.
You can see your evolution of the commit graph by launching git log --graph --oneline --all --decorate
at each step.
git checkout master
1 origin/master, HEAD -> master | 0
git pull master
1 origin/master, HEAD -> master | 0
git checkout -b branchA
1 origin/master, master, HEAD -> branchA | 0
edit branchA
git review
2 HEAD -> branchA | 1 origin/master, master | 0
git checkout -b branchB
2 branchA, HEAD -> branchB | 1 origin/master, master | 0
edit branchB
git commit
3 HEAD -> branchB | 2 branchA | 1 origin/master, master | 0
git checkout branchA
3 branchB | 2 HEAD -> branchA | 1 origin/master, master | 0
edit branchA
--amend
you create a new commit with the same parent git review
3 branchB | | 2' HEAD -> branchA | | 2 | |/ 1 origin/master, master | 0
git checkout branchB
3 HEAD -> branchB | | 2' branchA | | 2 | |/ 1 origin/master, master | 0
edit branchB some more
git review
4 HEAD -> branchB | 3 | | 2' branchA | | 2 | |/ 1 origin/master, master | 0
git checkout -b branchC
4 branchB, HEAD -> branchC | 3 | | 2' branchA | | 2 | |/ 1 origin/master, master | 0
edit branchC
git commit
5 HEAD -> branchC | 4 branchB | 3 | | 2' branchA | | 2 | |/ 1 origin/master, master | 0
git checkout master
5 branchC | 4 branchB | 3 | | 2' branchA | | 2 | |/ 1 origin/master, HEAD -> master | 0
git pull master
5 branchC | 4 branchB | 3 | | 2' branchA | | 2 | | | | | 6 origin/master, HEAD -> master | | | |/ / | / |/ 2 | 0
git checkout branchA
5 branchC | 4 branchB | 3 | | 2' HEAD -> branchA | | 2 | | | | | 6 origin/master, master | | | |/ / | / |/ 1 | 0
git rebase master branchA
resolve merge conflicts
5 branchC | 4 branchB | 3 | | 2'' HEAD -> branchA | | 2 | | | | 6 origin/master, master | | | / | / |/ 1 | 0
git checkout master
5 branchC | 4 branchB | 3 | | 2'' branchA | | 2 | | | | 6 origin/master, HEAD -> master | | | / | / |/ 1 | 0
git merge branchA # the merge is fast-forward
5 branchC | 4 branchB | 3 | | 2'' branchA, HEAD -> master | | 2 | | | | 6 origin/master | | | / | / |/ 1 | 0
git checkout branchB
5 branchC | 4 HEAD -> branchB | 3 | | 2'' branchA, master | | 2 | | | | 6 origin/master | | | / | / |/ 1 | 0
git rebase master branchB # 2 should be dropped as 2'' is already is the branch
resolve merge conflicts
5 branchC | | 4' HEAD -> branchB | | 4 | | | | 3' | | 3 | | | | 2'' branchA, master | | 2 | | | | 6 origin/master | | | / | / |/ 1 | 0
git checkout branchC
5 HEAD -> branchC | | 4' branchB | | 4 | | | | 3' | | 3 | | | | 2'' branchA, master | | 2 | | | | 6 origin/master | | | / | / |/ 1 | 0
git rebase branchB branchC
resolve merge conflicts # As the rebase replays all the commits in branchB history that are not in branchC history, it will replay 2, 3, 4 and 5; that why, if you had conflicts, you may encounter them again
5' HEAD -> branchC | 4' branchB | 3' | 2'' branchA, master | 6 origin/master | / / / 1 | 0
design change requires refactoring branchA
git checkout -b refactorA
5' branchC | 4' branchB | 3' | 2'' branchA, master, HEAD -> refactorA | 6 origin/master | 1 | 0
edit refactorA
git review
5' branchC | 4' branchB | | 7 HEAD -> refactorA | | 3' | | / 2'' branchA, master | 6 origin/master | 1 | 0
git checkout branchB
5' branchC | 4' HEAD -> branchB | | 7 refactorA | | 3' | | / 2'' branchA, master | 6 origin/master | 1 | 0
git rebase refactorA branchB <== is this a mistake?
resolve merge conflicts (three sets of conflicts)
5' branchC | | 4'' HEAD -> branchB | | 4' | | | | 7 refactorA | | 3' | | / 2'' branchA, master | 6 origin/master | 1 | 0
git review
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.