How to merge a specific commit in Git

后端 未结 7 1322
攒了一身酷
攒了一身酷 2020-11-22 01:41

I have forked a branch from a repository in GitHub and committed something specific to me. Now I found the original repository had a good feature which was at HEAD

7条回答
  •  醉话见心
    2020-11-22 02:02

    The leading answers describe how to apply the changes from a specific commit to the current branch. If that's what you mean by "how to merge," then just use cherry-pick as they suggest.

    But if you actually want a merge, i.e. you want a new commit with two parents -- the existing commit on the current branch, and the commit you wanted to apply changes from -- then a cherry-pick will not accomplish that.

    Having true merge history may be desirable, for example, if your build process takes advantage of git ancestry to automatically set version strings based on the latest tag (using git describe).

    Instead of cherry-pick, you can do an actual git merge --no-commit, and then manually adjust the index to remove any changes you don't want.

    Suppose you're on branch A and you want to merge the commit at the tip of branch B:

    git checkout A
    git merge --no-commit B
    

    Now you're set up to create a commit with two parents, the current tip commits of A and B. However you may have more changes applied than you want, including changes from earlier commits on the B branch. You need to undo these unwanted changes, then commit.

    (There may be an easy way to set the state of the working directory and the index back to way it was before the merge, so that you have a clean slate onto which to cherry-pick the commit you wanted in the first place. But I don't know how to achieve that clean slate. git checkout HEAD and git reset HEAD will both remove the merge state, defeating the purpose of this method.)

    So manually undo the unwanted changes. For example, you could

    git revert --no-commit 012ea56
    

    for each unwanted commit 012ea56.

    When you're finished adjusting things, create your commit:

    git commit -m "Merge in commit 823749a from B which tweaked the timeout code"
    

    Now you have only the change you wanted, and the ancestry tree shows that you technically merged from B.

提交回复
热议问题