在没有提交的情况下,如何从git中的分支获取更改?
我正在寻找一种不那么垃圾的方法:在没有提交的情况下,如何从git中的分支获取更改?,git,Git,我正在寻找一种不那么垃圾的方法: git diff patch.DisableCreditCheck > ~/patch patch -p1 < ~/patch …但这会使您处于合并状态,无法在保留更改的同时恢复正常状态 救命啊!有什么好办法吗 (当您共享正在编写的代码的修补程序时,这是一件非常有用的事情;比有一组修补程序文件可以传递要好得多) 编辑:作为我试图实现的一个例子,假设我们有两个分支,master和config.me 当我执行git diff config.me>~/p
git diff patch.DisableCreditCheck > ~/patch
patch -p1 < ~/patch
…但这会使您处于合并状态,无法在保留更改的同时恢复正常状态
救命啊!有什么好办法吗
(当您共享正在编写的代码的修补程序时,这是一件非常有用的事情;比有一组修补程序文件可以传递要好得多)
编辑:作为我试图实现的一个例子,假设我们有两个分支,master和config.me
当我执行git diff config.me>~/patch时;patch-p1<~/patch结果是:
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: Web/Web.config
#
$git状态
#论分行行长
#要提交的更改:
#(使用“git重置磁头…”取消分级)
#
#修改:Web/Web.config
#
这是期望的结果。。。但是如果不使用补丁,它就不能很好地工作(特别是在windows上,它在检测应该完美合并的更改方面似乎非常糟糕,但是相反,它会变得混乱并写出一堆.orig和.rej文件)
所以,就像我说的;我希望来自没有提交的分支的更改作为本地未提交更改。两种方式:
首先,如果您希望更改来自branchA
,但不希望将其提交到分支branchB
:
>> git checkout branchB
>> git cherry-pick -n ..branchA
这将获得“在B和A之间”发生的所有提交,但不会提交它们<代码>git状态将显示一组已更改的文件
其次,如果您希望在新提交中进行更改,但不一定每次提交都进行更改:
这将在
B
的顶部重新设置分支A
的基础,但将允许您选择哪个提交到拾取
,哪个提交到挤压
。挤压实际上会将多个承诺压缩为一个更大的承诺。有关挤压的更多信息,请参见git help rebase。第一个示例表明,您不希望更改特定分支(即提交增量),而是希望工作树反映该分支的最新状态。(在尝试选择正确的命令时,可能会导致混淆的细微差异。)
有几种方法:
方法1:
$ git checkout patch.DisableCreditCheck .
$ git read-tree patch.DisableCreditCheck
$ git checkout --detached patch.DisableCreditCheck
$ git reset your-original-branch
$ git checkout -B your-original-branch
这将使您的工作树镜像补丁。DisableCreditCheck
。HEAD
与补丁之间的更改。DisableCreditCheck
将自动暂存。警告:它还将清除工作树中任何未提交的更改。(注意:该句点(
)必须是指向工作树根的路径。)
方法2:
$ git checkout patch.DisableCreditCheck .
$ git read-tree patch.DisableCreditCheck
$ git checkout --detached patch.DisableCreditCheck
$ git reset your-original-branch
$ git checkout -B your-original-branch
这将获取镜像补丁的索引。DisableCreditCheck
,但保持工作树不变
方法3:
$ git checkout patch.DisableCreditCheck .
$ git read-tree patch.DisableCreditCheck
$ git checkout --detached patch.DisableCreditCheck
$ git reset your-original-branch
$ git checkout -B your-original-branch
这是一个愚蠢的方法,与方法1大致相同。它包括在学院里,因为它可能更容易理解。你的问题还不完全清楚。是否要保留提交?你看了吗?@jszakmeister没有,我特别不想保留提交。不幸的是,它似乎不起作用。“$git cherry pick-n..config.me错误:Commit 190b2139b728b8b607e921346e61ee2adaefb2de是合并,但未提供-m选项。致命:cherry pick失败”。使用rebase可以实现提交,这不是我想要的。也就是说,cherry picking看起来和我想要的一模一样。我就是不知道怎么用它或者,您可以执行
git rebase-i branchB
,将最后一次提交设置为squash
,然后git reset--soft HEAD^
。它将把所有提交都拉到您的分支,将它们塞进一个提交中,然后撤消该提交,同时保持文件的原样。