1

我有一个分支,在那里我做了一些更改,但我最初弄错了并从错误的分支创建它,所以我有许多不同的更改,我不想在其中进行。那么我怎样才能清理它,所以我只有我已经完成的更改和来自 master 分支的更改?

4

2 回答 2

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 依次应用每个补丁并等待用户提交它,如果有冲突。在这种情况下,解决冲突并执行 agit cherry-pick --continue以自动移动到下一个提交。或用于git cherry-pick --abort中止整个操作。

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

git branch -D <old messed up branch name>

有关详细信息,请参阅git cherry-pick 手册页

编辑:包括关于git cherry-pick --continueEOL 在评论中提到的信息。


更新

您提到您只想挑选那些您创建的提交。这可以通过这个小 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
于 2013-04-25T10:33:24.467 回答
1

如果您的更改全部在上游分支之上进行(即,您没有来自上游的任何合并提交与您的更改混合),您可以将其重新设置在 master 之上。

git branch backup # 总是先备份 ;)
git rebase --onto master <来自错误上游分支的最新提交>

假设您的分支相对于上游是最新的,那只是

git rebase --onto master <错误的上游分支>

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

git branch --set-upstream <你的分支> origin/master

(或者只是 git branch -u origin/master 与 git >=1.8)

于 2013-04-25T13:16:01.253 回答