Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git合并更改是否应该影响源分支?(为什么我丢了一些工作?)_Git - Fatal编程技术网

git合并更改是否应该影响源分支?(为什么我丢了一些工作?)

git合并更改是否应该影响源分支?(为什么我丢了一些工作?),git,Git,我似乎丢失了一些值得编辑的文件,所以我试图找出我做错了什么。显然,git合并似乎同时影响了源分支和目标分支。我不担心找到丢失的编辑,只担心修复我对git的理解 我有一个development分支机构。我创建了一个feature-x分支,做了一些工作,并进行了一次影响8个文件的提交(将该提交称为“WIP”)。然后我切换回develope,在其他功能上做了一些其他工作(自从合并后),今天我需要从feature-x到develope,获得一些片段: git checkout develop git m

我似乎丢失了一些值得编辑的文件,所以我试图找出我做错了什么。显然,git合并似乎同时影响了源分支和目标分支。我不担心找到丢失的编辑,只担心修复我对git的理解

我有一个
development
分支机构。我创建了一个
feature-x
分支,做了一些工作,并进行了一次影响8个文件的提交(将该提交称为“WIP”)。然后我切换回
develope
,在其他功能上做了一些其他工作(自从合并后),今天我需要从
feature-x
develope
,获得一些片段:

git checkout develop
git merge feature-x --no-commit --no-ff
所以现在
develope
将我的
feature-x
更改放在顶部,未提交/未发布。我暂存并提交了其中的两个文件(称之为提交“两个文件”),但决定不准备将其余文件提交到
develope
。我想把它们留在
feature-x
中,但我认为值得将
feature-x
重新设置到当前的
develope
分支上。在这一点上,我认为
feature-x
应该保持不变-合并应该只改变
develope
。因此,我清理了合并中未提交的更改:

git reset --hard HEAD; git clean -f -d
并尝试将
feature-x
重新定位到开发:

git checkout feature-x
git rebase develop
我希望我的历史记录现在能显示所有旧的
develope
提交,然后是新的“两个文件”提交,然后是
feature-x
中的“WIP”提交。但我看到的只是“两个文件”。。。“WIP”提交的更改似乎消失了


那么我哪里出了问题?我忘了在重新基址之前签出
feature-x
后检查提交日志,但我必须假设“WIP”提交已经消失,因为它在重新基址之后消失了。
合并--no commit--no ff
开发
上是否也更改了
功能-x

我会用以下方法执行此操作:

我意识到我需要
feature-x
最后一次(WIP)提交的部分内容。我签出到
feature-x

git checkout feature-x
我重置了上次提交:

git reset --soft HEAD~1
我取消stage all,只对两个文件进行所需的更改(至少在我的VSCode中,可以只对文件的选定部分进行暂存)。在此之后,我承诺:

git commit -m "Two files" // git will generate a commit with hash `a1b2c3d4`
我准备好了剩下的并承诺:

git add .
git commit -m "WIP rest"
现在,我可以在develop上选择所需的更改:

git checkout develop
git cherry-pick a1b2c3d4

使用
cherry pick
的优点是,当我将我的
feature-x
分支重新设置基础或与develope合并时,它不会引起问题,因为git会意识到这两个分支中的变化完全相同。

我将采用以下方法:

我意识到我需要
feature-x
最后一次(WIP)提交的部分内容。我签出到
feature-x

git checkout feature-x
我重置了上次提交:

git reset --soft HEAD~1
我取消stage all,只对两个文件进行所需的更改(至少在我的VSCode中,可以只对文件的选定部分进行暂存)。在此之后,我承诺:

git commit -m "Two files" // git will generate a commit with hash `a1b2c3d4`
我准备好了剩下的并承诺:

git add .
git commit -m "WIP rest"
现在,我可以在develop上选择所需的更改:

git checkout develop
git cherry-pick a1b2c3d4

使用
cherry pick
的优点是,当我将我的
feature-x
分支与develope重新基础或合并时,它不会引起问题,因为git会意识到这两个分支中的变化完全相同。

首先,我建议在下面的步骤中处理这些概念。它们对于理解Git是如何工作的至关重要

至于发生了什么,我制作了一个小存储库,并尽可能地重复了您的一些命令,正如您在这里告诉我们的:

因此,现在develop将我的feature-x更改放在最上面,未提交/未发布

不,你现在处于一个未完成的合并过程中。
--no commit
选项禁止提交,将您留在该合并中

$ git merge feature-x --no-commit --no-ff
Automatic merge went well; stopped before committing as requested
此外,Git会自动将所有成功合并的文件复制到临时区域。暂存区域也称为索引,我更倾向于使用这个名称来保存所有提交的文件。每次提交都是每个文件的完整快照,以便以后可以完整地提取它

$ git status
On branch develop
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

        modified:   README
        new file:   new.1
        new file:   new.2
如果您使用
git reset
(在其多种模式中的一种模式下,该命令执行了太多不同的操作,因此谈论它可能会很棘手),您可以将文件从一个提交复制回暂存区域,以便某个文件的暂存区域版本与文件的
develop
版本匹配,或者根本没有文件的副本(如果文件是新的),而不是包含某些合并操作的结果

我暂存并提交了其中两个文件(称为提交“两个文件”)

不,此时您只是完成了合并。Git现在知道,两个分支上的一系列提交的正确组合是这个特定提交的结果

请注意,
git commit——此时只能使用

$ git commit --only README
fatal: cannot do a partial commit during a merge.
另一方面,
git commit——include
can,但这相当于运行
git add
,然后运行
git commit
,以便提交合并

$ git commit
此时,编辑器打开一个文本文件,读取:

Merge branch 'feature-x' into develop
# 
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
#       .git/MERGE_HEAD
# and try again.


# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch develop
# All conflicts fixed but you are still merging.
#
# Changes to be committed:
#       modified:   README
#       new file:   new.1
#       new file:   new.2
#
将此文件写入并退出会产生:

[develop 2313673] Merge branch 'feature-x' into develop
我的结论是,要么您运行了一个未显示的命令,而这可能是至关重要的,要么您提交了合并,这将解释您看到的行为。特别是:

合并--no commit--no ff
develope
是否也改变了
feature-x

否:但提交合并会更改未来操作的合并基础,并更改可从各种分支名称访问哪些提交集。这会影响git rebase。特别是,您在
feature-x
上所做的WIP提交现在可以从中访问,因此包含在-
develope
中,因此使
featu