3

我在一个分支工作,得到一个工作副本真的很不干净。在查看要提交的更改时,我希望将一些 oneliner 修复提交到master分支。

在这种情况下,使用git stash并没有真正的帮助,因为我的工作副本有很多其他的更改还不会与 master 合并。

有没有更有效的方法来解决这种情况?(例如做出提交,并移动它的父母?)

4

6 回答 6

5

您可以使用git add -i交互模式。您可以在此处指定要提交的内容和要跳过的内容。

这样,您可以将您的单行代码作为单独的提交提交。通过使用git cherry-pick,您可以稍后将它们合并到您的主人。

于 2009-12-03T16:10:41.040 回答
3

用于git add -i选择您要提交到此分支的内容,然后更改为 master 并提交其余部分。

add -i您可以选择要准备提交的文件的哪些部分,然后提交它们,同时将相同文件的其他部分排除在提交之外。

于 2009-12-03T16:09:15.850 回答
2

git add -p将直接让您进入补丁模式以遵循@arkaitz-jimenez 正确推荐的过程。

于 2009-12-03T17:05:36.827 回答
1

我不知道这是否是您想要的,但我只会检查另一个分支(不会丢失未提交的更改),然后有选择地检查您要提交的更改。

于 2009-12-03T16:04:55.167 回答
1

根据之前的建议,这是我提出的解决方案:

解决方案 1 与樱桃采摘

只需在分支本身提交单个更改:

git add --patch <files>      # record every change to move to master
git commit

移动到主人,并挑选

git stash
git checkout master
git cherry-pick <commitid>

回到分支中,它可以重新定位。

git checkout <branch>
git rebase master

对于每个重复提交,系统都会提示您输入:

git rebase --skip

重复的提交从分支中的补丁集中被过滤掉,并且历史是干净的。git merge毕竟决赛仍然可以快进。

解决方案2,不必先在分支中提交

首先提取所有内容以移动到master:

git add --patch <files>      # record every change to move to master

然后切换到master提交:

git stash --keep-index       # clear the working copy only
git checkout master -m       # merge the index.
git commit

而回到分支,可以直接rebase到master的tip:

git checkout <branchname>
git rebase master            # move to branch start to the tip of master.
git stash apply              # restore working copy, auto merges the changes

方案3、克隆当前master分支

如果您不介意拥有多个工作副本(实际上我总是用 SVN 这样做),还有第三种解决方案:

mkdir ../newrepos
cd ../newrepos
git init
git remote add origin /path/to/your/repository
git fetch master:remotes/origin/master  # fetch remote master to local remotes/origin/master
git checkout -t origin/master           # make new "master" branch, link to remote, checkout.

git commit
git push origin master                  # inject the change in the original repository.

克隆设置在这里手动完成,因为git clone总是克隆当前活动的分支。


对于更复杂的情况,总是有一个额外的安全防护git diff > to-master.patchgit apply to-master.patch。这使您可以更自由地重置所有内容,并重试直到您做对为止。

在这种情况下,我们正在处理两个分支中都存在的文件中的单行修复。这不会产生任何合并冲突,并允许使用一些快捷方式,例如checkout -m.

于 2009-12-04T09:53:53.877 回答
0

除了使用git add -i/git add -p您还可以使用交互式添加模式git gui
(可能是其他 git 图形界面,包括提交工具,例如 QGit,具有此功能)

于 2009-12-03T18:49:58.207 回答