Why git rebase shows conflicts in the files I did not modify? -
let's on local repo , branch my_name/branch_a
when git rebase <branch_b>, many conflicts in files did not modify.
why happen? head of files branch_b except ones modified in my_name/branch_a. how can done without manually resolving these conflicts did not introduce myself.
rebase copies commits (and abandons originals). root of problem.
let's @ example. first, note i'm drawing commit graphs older commits towards left, , newer commits towards right. commits have single-letter names here, instead of git's true 40-character hash names f1c93ab7.... branch names appear on right, arrow pointing tip commit of branch, because how git stores these things.
your current branch name my_name/branch_a, , have branch named branch_b well. there commits on each branch not on other branch, , commits on both branches. meanwhile branch, my_name/branch_a, forks off third point—so there commits on branch not on branch_b, not "your commits":
...--a--b--c--d--e <-- branch_uhoh \ \ \ i--j <-- my_name/branch_a \ f--g--h <-- branch_b you made commits i , j , have 2 commits come after commit h, i.e., rework commits "after" tip of branch_b.
in other words, did not make commits c--d--e. nonetheless, these commits on branch. in fact, commits a , b on branch too: 2 commits on all branches.
if run git rebase branch_b (while you're still on branch), git has figure out 2 things:
- what copy, and
- where start putting copies.
the name branch_b tells git both of these things. commits copied "those on my_name/branch_a not on branch_b. that's c-d-e-i-j. place put them "after tip commit of branch_b, i.e., after commit h.
if succeeds, git set branch name point new copies:
...--a--b--c--d--e <-- branch_uhoh \ \ \ i--j [abandoned] \ f--g--h <-- branch_b \ c'-d'-e'-i'-j' <-- my_name/branch_a the names "prime" marks (c' , on) copies.
(you can view commits git rebase would/will copy git log <upstream>..head, in case git log branch_b..head. add --oneline here in cases one-line log message per commit.)
well, if that's problem, should do? obvious answer is: tell git not copy c-d-e. want result instead:
...--a--b--c--d--e <-- branch_uhoh \ \ \ i--j [abandoned] \ f--g--h <-- branch_b \ i'-j' <-- my_name/branch_a that is, git should copy commits "between" (after, really) tip of branch_uhoh , branch, commits i , j; should copy them to (again, after, really) tip of branch_b. way write:
git rebase --onto branch_b branch_uhoh in other words, tell rebase both things, instead of telling one thing , letting figure out 2 that.
(but how find branch_uhoh? well, "right" way remember it, can run git log --graph --decorate --oneline , find cutoff commit id or name shows up. instead of branch_uhoh can cut-and-paste hash id of actual cutoff commit. often, can have git itself remember "upstream" name you, , rebase within , onto upstream , need no arguments: run git rebase , work. there special cases need transplant commits, not sufficient; need git rebase --onto.)
Comments
Post a Comment