Git clean分支只保存我对master的更改和更改

时间:2013-04-25 10:11:45

标签: git git-branch

我有一个分支,我做了一些更改,但我最初错了并从错误的分支创建它,所以我有很多不同的变化,我不想在其中。那么我该怎样才能清理它,所以我只做了一些改变,从主分支改变了?

2 个答案:

答案 0 :(得分:2)

您可以从master创建一个新分支,然后挑选您在新分支中所做的更改。

查找要保存的每个提交的提交哈希值。然后:

git checkout master
git checkout -b <new branch name>
git cherry-pick <commit hash> # for every commit you want to save

cherry-pick单一提交可能很乏味,当你有很多时。由于git 1.7.2+ cherry-pick可以处理提交范围。

git cherry-pick <first commit to save>^..<last commit to save>

正如EOL在评论中指出的那样,如果存在冲突,cherry-pick依次应用每个补丁并等待用户提交。在这种情况下,解决冲突并执行git cherry-pick --continue以自动移动到下一个提交。或者使用git cherry-pick --abort中止整个操作。

现在检查你当前的分支。如果一切正常,您可以删除之前混乱的分支:

git branch -D <old messed up branch name>

有关详细信息,请参阅git cherry-pick manual page

修改包含了有关git cherry-pick --continue的信息,EOL在评论中提到了这些信息。


<强>更新

你提到你想要挑选你创建的那些提交。这可以通过这个小的bash脚本来完成:

author_name="Your Git Author Name"
start_commit="earliest commit hash to cherry-pick"
end_commit="latest commit hash to cherry-pick"

git rev-list --reverse --topo-order "$start_commit^..$end_commit" | while read rev
do
  commit_author_name=`git log --pretty=format:"%an%n" -n 1 $rev`
  if [[ $commit_author_name == *"$author_name"* ]]; then
    git cherry-pick $rev || break
  fi
done

答案 1 :(得分:1)

如果您的更改都是在上游分支之上进行的(即您没有任何来自上游的合并提交与您的更改混合在一起),您可以在主服务器上重新进行更改。

  

git branch backup#始终先备份;)
  git rebase --onto master&lt;来自错误的上游分支的最新提交&gt;

假设你的分支是关于上游的最新的,那就是

  

git rebase --onto master&lt;错误的上游分支&gt;

之后,您可能希望将当前分支的跟踪分支更改为master:

  

git branch --set-upstream&lt; your branch&gt;原点/主

(或者只是git branch -u origin / master with git&gt; = 1.8)