我有一个带有2个分支的git存储库:master和test。
主分支和测试分支之间存在差异。
两个分支均已提交所有更改。
如果我做:
git checkout主
git diff测试
出现变化的屏幕,显示差异。我想合并测试分支中的更改,然后这样做:
git合并测试
但是收到消息“已经是最新的”
但是,检查每个不同分支下的文件显然会显示出差异。
这是什么问题,我该如何解决?
我有一个带有2个分支的git存储库:master和test。
主分支和测试分支之间存在差异。
两个分支均已提交所有更改。
如果我做:
git checkout主
git diff测试
出现变化的屏幕,显示差异。我想合并测试分支中的更改,然后这样做:
git合并测试
但是收到消息“已经是最新的”
但是,检查每个不同分支下的文件显然会显示出差异。
这是什么问题,我该如何解决?
Answers:
消息“已经是最新的”表示您要合并的分支中的所有更改都已合并到您当前所在的分支中。更具体地说,这意味着您要合并的分支是当前分支的父级。恭喜,这是您做过的最简单的合并。:)
用于gitk
查看您的存储库。“测试”分支的标签应位于“主”分支标签下方的某处。
您的分支机构相对于其父分支是最新的。根据合并,自上次合并以来,父项中没有新的更改。这并不意味着分支是相同的,因为您可以在工作分支中进行很多更改,听起来就像您所做的那样。
编辑10/12/2019:
根据Charles Drake在对此答案的评论中,解决该问题的一种解决方案是:
git checkout master
git reset --hard test
这使它回到“测试”级别。
然后做:
git push --force origin master
为了迫使更改返回中央仓库。
当我知道远程主服务器上有更改时,通常会发生这种情况,因此我尝试使用进行合并git merge master
。但是,这不会与远程主服务器合并,而是与您的本地主服务器合并。
因此,在进行合并之前,请先检出母版,然后再进行git pull
那里。然后,您将能够将新更改合并到您的分支中。
git fetch
即使我现在在另一个分支上,也会更新master分支。事实并非如此。谢谢!我很确定有一个选项fetch
可以让您指定要获取的分支。
git fetch --all
,但这只会获取分支,而不会提取它们。
git fetch --all && git merge origin/master
。无需更新本地master
以合并远程更改。
git merge master
和git merge origin/master
。我也已经签出master
并git pull
更新2个分支之前。即使它们共享相同的内容,但在两个分支之间创建PR仍显示了一些差异文件。我git pull
将目标分支固定为功能分支,该分支显示:Already up to date! Merge made by the 'recursive' strategy.
这导致合并提交没有更改,但从PR中删除了意外的diff文件。任何想法为什么合并“等效”本地分支和远程分支之间会有区别?
假设您有一个master
具有以下提交历史记录的分支:
A -- B -- C -- D
现在,您创建一个分支测试,对其进行处理,并执行4次提交:
E -- F -- G -- H
/
A -- B -- C -- D
master
的头部指向D,而test
的头部指向H。
当您要合并的分支的HEAD是您要合并的分支的提交链的父级时,将显示“已经更新”消息。是这样,这里D
是:的父项E
。
从test
到没有要合并的内容master
,因为从那以后没有任何变化master
。您在这里要做的实际上是告诉Git master
的头指向H,因此master的分支具有以下提交历史记录:
A -- B -- C -- D -- E -- F -- G -- H
这是Git命令的工作reset
。您还希望工作目录反映此更改,因此将进行硬重置:
git reset --hard H
git reset --hard
是一件很艰巨的事情,它会丢失提交吗?有进行这些更改的更安全方法,还是git reset --hard
夸大其词的危险?
--hard
选项唯一要注意的是它实际上会修改您的工作目录,因此,您将丢失未提交的更改。就个人而言,我git status
在每个手动运行的git命令之前和之后都要执行一次操作,以确保我的存储库是干净的或处于预期状态。
--hard
选项?我现在已经遇到过这种情况了两次,并且始终不进行重置--hard
。它工作得很好,没有丢失任何未提交的更改的风险。
对我有用的是,假设您有branch1,并且想要将其合并到branch2。
您打开git命令行转到branch2的根文件夹,然后键入:
git checkout branch1
git pull branch1
git checkout branch2
git merge branch1
git push
如果您有冲突,则无需执行git push,但首先要解决冲突,然后再进行推送。
发生这种情况是因为您要合并的分支的本地副本已过期。我有我的分支机构,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 merge ProjectMaster
,git会查看该分支的本地副本,它可能不是最新的。要查看是否是这种情况,我首先告诉Git检查分支是否过时,并使用uh来获取所有更改(如果有的话)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次提交,已经过时了,这可以解释所有内容!现在,我Pull
查看丢失的更改,然后跳至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 merge 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>
发生在我身上,并发送到此页面,不确定我是否遇到相同的情况,但是我的原因是我试图“重新合并”该“测试”分支。
因此,我之前进行了合并,但是在合并过程中我有意排除了一些特定的更改,因此显然分支之间存在一些差异。然后,我尝试重新合并它,因为我意识到/忘记了我应该拥有的,并想添加一个以前不包含的特定更改/文件,并且希望再次进行合并将显示之前排除的所有更改。 ,但我错了,而是收到了“已经最新”消息。
阅读@Bombe的评论/答案后,他是对的,我认为git就是这种行为,所以我要做的是对test分支上的文件进行硬备份,然后检出master分支并手动将文件粘贴到其中并提交好像是新的变化。
我不确定这是正确的方法还是可以帮助其他人遇到同样的问题,但这确实为我的特殊情况提供了解决方案。
git checkout srcBranch -- path/to/file
。也可以使用文件全局。
checkout srcBranch -- *
,然后看了看我的diff文件
如果将分支机构A合并到分支机构B时报告“已经更新”,则反向并不总是正确的。仅当分支B是分支A的后代时才是正确的,否则分支B可以简单地进行不在A中的更改。
例:
此时,将A合并到B会报告“已经更新”,但是分支是不同的,因为分支B具有来自主服务器的更新,而分支A没有。
使用Git Bash面对这种情况。
我们的存储库有多个分支,每个分支都有不同的提交周期,并且合并有时会发生一次。Old_Branch被用作New_Branch的父项
Old_Branch已更新,其中包含一些需要与New_Branch合并的更改
正在使用下面的pull命令,而没有任何分支从所有分支获取所有源。
git pull起源
奇怪的是,这并没有从所有分支中提取所有提交。曾以为如此,所以所显示的几乎显示了所有分支和标签。
因此,要解决此问题,请检查出Old_Branch使用了最新的
git checkout Old_Branch
git pull origin Old_Branch
现在已签出New_Branch
git checkout New_Branch
一定要拉
git pull origin New_Branch
git merge Old_Branch
而且中提琴发生了冲突,需要将其从Old_Branch修复为New_Branch :)
我也一样。但是情况有所不同,我有master分支,然后从中剔除了release_1(例如)。在release_1分支中进行了一些更改,并将其合并为原始文件。然后我做了ssh,然后在远程服务器上我再次使用命令git checkout -b release_1签出release_1,实际上是切出了一个新的分支release_!而不是从原始数据库中检出已经存在的分支release_1。通过删除“ -b”开关解决了该问题
我有同样的问题。我在遥控器上进行了更改,但仍显示“已经更新”。重新存储库为我解决了这个问题。