我有一个git仓库,有2个分支:master和test。
主分支和测试分支之间存在差异。
两个分支都提交了所有更改。
如果我这样做:
git checkout master
git diff test
屏幕上会出现一个充满变化的屏幕,显示不同之处。我想合并测试分支中的更改,这样做:
git merge test
但是得到的信息是"Already - updated "
但是,检查每个不同分支下的文件可以清楚地显示出差异。
这里的问题是什么,我如何解决它?
我有一个git仓库,有2个分支:master和test。
主分支和测试分支之间存在差异。
两个分支都提交了所有更改。
如果我这样做:
git checkout master
git diff test
屏幕上会出现一个充满变化的屏幕,显示不同之处。我想合并测试分支中的更改,这样做:
git merge test
但是得到的信息是"Already - updated "
但是,检查每个不同分支下的文件可以清楚地显示出差异。
这里的问题是什么,我如何解决它?
当前回答
这可能看起来微不足道,但我见过许多人忽略它,只是在父分支上进行git合并。这将自动导致“已经更新”的消息。
合并命令应该是git merge branchNametoMergeFrom
例如,假设你有2个分支branchA和branchB,你需要将B合并为a,你需要首先签出到branchA,然后使用merge命令,同时指定要合并的分支(在这种情况下是branchB)。
因此,命令不应该只是git merge,而应该是git merge branchB。
其他回答
发生这种情况是因为您要合并的分支的本地副本已经过期。我有我的分支,叫MyBranch我想把它合并到ProjectMaster中。
_>git status
On branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.
nothing to commit, working tree clean
_>git merge ProjectMaster
Already up-to-date.
但我知道有些变化需要合并!
事情是这样的,当我输入git合并ProjectMaster时,git会查看这个分支的本地副本,这可能不是当前的。要查看情况是否如此,我首先告诉Git检查并查看我的分支是否过期,如果是的话,使用fetch获取任何更改。然后我跳到我想合并的分支,看看那里发生了什么……
_>git fetch origin
_>git checkout ProjectMaster
Switched to branch ProjectMaster
**Your branch is behind 'origin/ProjectMaster' by 85 commits, and can be fast-forwarded.**
(use "git pull" to update your local branch)
啊哈!我的本地副本在85次提交时就过时了,这说明了一切!现在,我拉下我所遗漏的更改,然后跳转到MyBranch并再次尝试合并。
_>git pull
Updating 669f825..5b49912
Fast-forward
_>git checkout MyBranch-Issue2
Switched to branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.
_>git merge ProjectMaster
Auto-merging Runbooks/File1.ps1
CONFLICT (content): Merge conflict in Runbooks/Runbooks/File1.ps1
Automatic merge failed; fix conflicts and then commit the result.
现在我有另一个问题要解决…
这种情况发生在我身上,因为GIT奇怪地认为本地分支与远程分支不同。 这在分支图中可见:它显示了两个不同的分支:remotes/origin/branch_name和branch_name。
解决方案是简单地删除本地回购并从远程重新克隆它。这样GIT就会理解remotes/origin/branch_name>和branch_name确实是相同的,并且我可以发出GIT合并branch_name。
rm <my_repo>
git clone <my_repo>
cd <my_repo>
git checkout <branch_name>
git pull
git checkout master
git merge <branch_name>
当我知道远程主机上有更改时,这种情况经常发生在我身上,所以我尝试使用git merge master合并它们。但是,这不会与远程主服务器合并,而是与本地主服务器合并。
在合并之前,签出master,然后git拉到这里。然后您将能够将新的更改合并到您的分支中。
下面是从另一个分支获得更改的方法,而不考虑合并历史(注意:这会清除工作树,所以git在尝试之前会隐藏或提交更改)
// stash changes to ensure you don't lose any edits
git checkout your-branch-that-won't-simply-merge
git stash
git checkout branch-with-changes -- .
——。参数将检出其他分支的所有文件,同时仍检出到同一分支。然后您可以按照自己的意愿添加和提交。
我还将它与 Git add -p 这将使你能够在“大块头”中进行任何变化。它会询问y/n您是否想要执行任何更改过的行块,这意味着您可以在下次提交时保留不想要的更改。
这是我找到的原始答案的链接,去点赞吧。: https://stackoverflow.com/a/15536640/8272035
89年问题 通过提供当前路径,.:
Git签出other-branch-name——。
此操作类似于在不签出文件的情况下将HEAD切换到另一个分支,但只是从“另一个方向”切换。
正如@김민준提到的,这将覆盖任何未提交的更改。如果需要的话,记得先把它们藏起来或提交到某个地方。
假设你有一个具有以下提交历史的分支master:
A -- B -- C -- D
现在,你创建了一个分支测试,处理它,并执行4次提交:
E -- F -- G -- H
/
A -- B -- C -- D
主人的头指向D,测试者的头指向H。
当你要合并的分支的HEAD是你想要合并的分支的提交链的父节点时,就会显示“Already - updated”消息。 这里的情况就是这样:D是E的父结点。
从测试到主服务器没有什么需要合并的,因为从那时起主服务器上没有任何变化。 你在这里要做的就是告诉Git让master的head指向H,所以master的分支有如下的提交历史:
A -- B -- C -- D -- E -- F -- G -- H
这是一个Git命令重置的作业。 你也想让工作目录反映这个变化,所以你要做一个硬重置:
git reset --hard H