在没有提交的情况下,如何从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^
。它将把所有提交都拉到您的分支,将它们塞进一个提交中,然后撤消该提交,同时保持文件的原样。