我在一个分支机构工作,得到一份真正不干净的工作副本。在查看提交的更改时,我希望将一些oneliner修复提交到master
分支。
在这种情况下,使用git stash
并没有真正帮助,因为我的工作副本还有许多其他更改,但不会与master合并。
有没有更有效的方法来解决这种情况? (例如,提交,移动它的父级?)
答案 0 :(得分:5)
您可以使用git add -i
来使用交互模式。在那里,您可以指定,提交什么以及跳过什么。
通过这种方式,您可以将oneliner提交为单独的提交。通过使用git cherry-pick
,您可以稍后将它们合并到主文件中。
答案 1 :(得分:3)
使用git add -i
选择要提交给此分支的内容,然后更改为master并提交其余内容。
使用add -i
,您可以选择要为提交准备哪些文件的哪些部分然后提交它们,同时将相同文件的其他部分保留在提交之外。
答案 2 :(得分:2)
git add -p
会让您直接进入补丁模式,以便按照@ arkaitz-jimenez正确推荐的流程进行操作。
答案 3 :(得分:1)
我不知道这是否是您想要的,但我只是检查另一个分支(不会丢失未提交的更改),然后有选择地检查您要提交的更改。
答案 4 :(得分: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,无需先在分支机构中提交
首先提取所有内容以转移到掌握:
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
回到分支机构,它可以直接重新定位到主人的小费:
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,复制当前主分支
如果你不介意有多个工作副本(我总是用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.patch
和git apply to-master.patch
总会有额外的安全防护。这使您可以更自由地重置所有内容,并尝试直到您做对了。
在这种情况下,我们正在处理两个分支中存在的文件中的单行修复。这不会产生任何合并冲突,并允许一些快捷方式,如checkout -m
。
答案 5 :(得分:0)
您还可以使用git add -i
/ git add -p
的交互式添加模式,而不是使用git gui
/ {{1}}(可能还有其他git图形界面,这些都在clude提交工具中,例如QGit,有此功能)