- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据我对 merge 冲突的理解,当两个人更改了同一文件和/或修改了该文件中的同一行时,就会发生 merge 冲突。所以当我做一个git pull origin master
我期望 merge 冲突,因为两个版本中的同一行是不同的,但是看起来git决定覆盖我的本地文件。
要提供更多信息,
几天前,我在Github上推送了我的版本。然后有人 pull 了它,使用它,然后将其推回到github。另一个家伙修改的两个文件对我来说很有趣。
第一个文件是配置文件,另一个人在其中更改了密码。因此,当我从github pull 出时,本地版本中的密码与github上的密码不同。但是,在我的终端上,它说
Auto-merging <filename>
git checkout -b "misc"
git pull origin master
最佳答案
Git的行为正确。这是预期的结果(尽管对您而言不是真正的“期望”)。
关于如何与Git一起使用以使其对您真正有用的内容,在底部有一些介绍。
除了Mykhailo Kovalskyi's answer之外,还有一种更可能的情况。您这样做:
git checkout -b "misc"
git pull origin master
第一行很简单。这是第二个问题,因为
git pull
是
git fetch
,后面是
git merge
,这两者都非常复杂。
git log
进行查看,请使用
--graph
(通常与
--oneline
一起使用)。要使用可视化工具查看它,请使用诸如
gitk
之类的东西或许多烦人的GUI中的一种,这些 View 会给您提供类似于
here所示的 View (这是关于stackoverflow的随机选择的问题,它涉及
gitk
和
git-gui
中看到的内容)。
git fetch
和
git merge
的运行情况。
master
分支的存储库图,上面有四个提交:
o--o--o--o <-- master
master
分支“指向”最尖端的提交。在此图中,右侧有较新的提交,即最右边的提交。
o--o--o
中的线实际上应该是箭头:
o <- o <- o
。但是这些箭头都指向后方,这很烦人,对人类几乎没有用,因此最好将它们绘制为线条。事实是,这些向后箭头是Git查找较早提交的方式,因为分支名称仅指向最尖端的提交!
HEAD
,它是“当前提交”的符号。 HEAD正常工作的方式是它实际上包含分支名称,然后该分支名称指向提示提交。我们可以用一个单独的箭头绘制它:
HEAD
|
v
o--o--o--o <-- master
但这占用了太多空间,因此我通常使用以下方法:
o--o--o--o <-- master (HEAD)
Git将发现
HEAD
已“附加到”
master
(包含名称)
master
,然后按照从
git checkout -b misc
到向后提交的反向箭头进行操作。
Hint: use
git log --decorate
to show branch names andHEAD
. It's particularly good with--oneline --graph
: think of this as a friendly dog: Decorate, Oneline, Graph. In Git 2.1 and later,--decorate
happens automatically, so you don't have to turn it on yourself most of the time. See also this answer to Pretty git branch graphs.Note that
git log --decorate
prints the decoration asHEAD -> master
whenHEAD
points tomaster
. WhenHEAD
points directly to a commit, Git calls this a detached HEAD, and you might seeHEAD, master
instead. This formatting trick was new in Git 2.4: before that, it just showedHEAD, master
for both detached HEAD mode, and non-detached-HEAD mode, for this case. In any case, I call "non-detached" an attached HEAD, and I thinkmaster (HEAD)
shows this attachment pretty well.)
git gc
步骤创建一个新的分支名称。默认情况下,这个新的分支名称指向当前的(HEAD)提交,所以现在我们有了:
o--o--o--o <-- master, misc (HEAD)
git fetch
删除它们可能很困难。即使您希望它们消失,Git也会尽力让您找回。
git fetch
git fetch origin
的功能可以概括为:
master
时会发生什么。你有这个:
o--o--o--o <-- master, misc (HEAD)
他们有这个,在
origin/master
上有一些额外的提交(而且我们现在不在乎他们的HEAD):
o--o--o--o--o--o <-- master
您的Git重命名了它们的主文件,并在自己的末端将其称为
origin
,以便您可以使它们保持笔直。他们的两个新提交都添加到您的存储库中,所有这些都类似于Borg。这些新的提交指向具有常规向后箭头的现有四个提交,但是现在绘制图形需要更多的空间:
o--o--o--o <-- master, misc (HEAD)
\
o--o <-- origin/master
请注意,您的所有分支都没有更改。仅
origin/master
更改。您的Git增加了它们的技术独特性2,并重新指向
master
以跟踪“上次我检查时
origin
在
12ab9fc7...
上的位置”。
12ab9fc7...
,而您的Git具有commit
git merge
,则您的Git已经具有其提交,反之亦然。所有这些背后的数学是相当深刻而优美的。
git pull
git merge
的第二部分是运行
git merge origin/master
。它运行
git merge
的等效项3。
git merge
命令从查找 merge 基础开始,这是图突然变得很重要的地方。
o--o <-- branch1 (HEAD)
/
o--o--o--*
\
o--o--o <-- branch2
*
的作用是找到最近的共同祖先提交,我将其绘制为
o
而不是这里的
git merge
。这就是 merge 的基础。这只是两个分支“ fork ”的起点。
branch1
的目标是找出“您”已更改的内容-自提交
*
以来您在
branch2
中所做的工作-以及“他们”已更改的内容,即自提交
*
以来
git diff
中已更改的内容。为了获得这些更改,Git运行两个
*
命令。
o--o--o--*--o--o <-- branch1 (HEAD)
\
o--o--o <-- branch2
这是同一张图,所以它是同一张 merge 。 Git将提交
branch1
与
*
的提示进行比较(“我们的两次提交有什么变化?”),然后将
branch2
与
*
的提示进行提交(“其三个提交有什么变化?”)。然后,Git会尽力 merge 这些更改,并根据结果进行新的 merge 提交。所有这些 merge 和提交的确切细节都无关紧要,因为我们没有这样的图。
o--o--o--* <-- master, misc (HEAD)
\
o--o <-- origin/master
请注意,我在这里保留了
git merge
的概念。那是因为
misc
仍然找到 merge 基础。这里的问题是 merge 基础是分支技巧:名称
*
直接指向commit
git diff <commit-*> <commit-*>
。
*
,则差异显然为空。 Commit
*
与commit
misc
相同。那么如何 merge 这些呢?
HEAD
分支标签并将其向前滑动,沿着狗腿向下然后向右滑动。结果看起来像这样:
o--o--o--o <-- master
\
o--o <-- origin/master, misc (HEAD)
所以现在我们的配置文件是
misc
提交中的一个,这是
origin/master
的最尖端的提交,与
git merge origin/master
相同的提交。
git fetch origin
的细节在这里几乎无关紧要,但与历史有很大关系。在Git的早期版本1.8.4之前,实际上没有真正更新过
origin/master
的某些
git fetch
。这是一个错误的设计决定,在所有现代Git版本中,
master
都会对其进行更新。
git pull
,因为它已经打乱了):
o--o--o--* <-- misc (HEAD)
\
o--o <-- origin/master
我们可以代替让
git merge
运行
git merge --no-ff origin/master
,而运行我们自己的
git pull
,以 merge origin/master,但不允许Git进行快速转发。这样有帮助吗?
git diff <commit-*> <commit-*> # this diff is empty
git diff <commit-*> origin/master # this is "what they changed"
然后,Git将我们的更改(无)与它们的更改 merge ,并进行新的 merge 提交:
o--o--o--o------o <-- misc (HEAD)
\ /
o--o <-- origin/master
我们有一个不同的图(有点像汤勺或
Big Dipper),但是我们接受了它们的更改,包括密码更改,而没有保留任何内容(自 merge 基础以来我们没有任何更改)。
A
.4。我们也可能希望选择一个较早的时间来建立自己的分支。我们希望图的分支保持它们自身的独特性。我给了其中一些提交字母名称,以便我可以谈论它们:
A-----B <-- misc (HEAD)
/ /
o--o--o--o <-- master
\
o--C <-- origin/master
在commit
git merge
中,我们将配置文件更改为具有不同的密码。然后,我们
master
(不是快进)
master
的技巧来获取新内容,而无需更改密码。这个步骤可能是非常手动的,也可能是全自动的,但是一旦提交,我们就完成了:提交是永久的;它们无法更改。5
git merge origin/master
“快进”:
A-----B <-- misc (HEAD)
/ /
o--o--o--*--o--C <-- master, origin/master
现在,当我们
git merge master
或
*
6时, merge 基础将是我标记为
*
的提交。如果我们没有将密码从
B
更改为
*
,而他们将其密码从
C
更改为
A
,我们将接听他们的更改-但他们不再需要更改它,因为我们从不发送密码来提交
B
和
*
;我们将这些保留给我们自己。因此,密码不应从
C
更改为
master
,并且在进行新 merge 时将保留更改后的密码:
A-----B-----D <-- misc (HEAD)
/ / /
o--o--o--o--o--C <-- master, origin/master
稍后,我们将拾取更多提交,将它们 merge (快进)到
C
,并准备再次 merge :
A-----B-----D <-- misc (HEAD)
/ / /
o--o--o--o--o--C--o--o <-- master, origin/master
这次, merge 基础将是
misc
提交-这是
C
及其分支上最接近的提交-Git将diff
origin/master
与
D
进行比较。大概他们仍然不会更改密码,因为我们仍然没有给他们提交
git pull
。
master
,但是根据您的操作方式,无论如何您都可以使用它,尤其是对于
git commit --amend
。
git rebase
和
master
都是这样工作的。
origin/master
的尖端和
master
的尖端是相同的提交。一个区别是默认提交消息将更改:一个将说“merge 主文件”,而另一个将说“merge 原件/主文件”。 (Git的提交消息格式中有一些奇怪的东西,也将
.config
与其他所有东西都区别对待,但是我们可以忽略不计。这只是一个历史产物。)
config.default
并有一些代码,例如:
[ -f .config ] || cp config.default .config
在第一次运行时将默认配置设置为
.config
文件。然后,使用
.gitignore
中的ojit_code,它将永远不会放入存储库中,因此它将永远不会出现在任何提交中,并且您首先不会遇到这个问题。
关于Git应该显示没有 merge 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40097125/
我正在尝试在Elasticsearch中返回的值中考虑地理位置的接近性。我希望近距离比某些字段(例如legal_name)重要,但比其他字段重要。 从文档看来,当前的方法是使用distance_fea
我是Elasticsearch的初学者,今天在进行“多与或”查询时遇到问题。 我有一个SQL查询,需要在Elastic中进行转换: WHERE host_id = 999 AND psh_pid =
智能指针应该/可以在函数中通过引用传递吗? 即: void foo(const std::weak_ptr& x) 最佳答案 当然你可以通过const&传递一个智能指针。 这样做也是有原因的: 如果接
我想执行与以下MYSQL查询等效的查询 SELECT http_user, http_req_method, dst dst_port count(*) as total FROM my_table
我用这两个查询进行测试 用must查询 { "size": 200, "from": 0, "query": { "bool": { "must": [ { "mat
我仍在研究 Pro Android 2 的简短服务示例(第 304 页)同样,服务示例由两个类组成:如下所示的 BackgroundService.java 和如下所示的 MainActivity.j
给定标记 like this : header really_wide_table..........................................
根据 shouldJS 上的文档网站我应该能够做到这一点: ''.should.be.empty(); ChaiJS网站没有使用 should 语法的示例,但它列出了 expect 并且上面的示例似乎
我在 Stack Overflow 上读到一些 C 函数是“过时的”或“应该避免”。你能给我一些这种功能的例子以及原因吗? 这些功能有哪些替代方案? 我们可以安全地使用它们 - 有什么好的做法吗? 最
在 C++11 中,可变参数模板允许使用任意数量的参数和省略号运算符 ... 调用函数。允许该可变参数函数对每个参数做一些事情,即使每个参数的事情不是一样的: template void dummy(
我在我从事的项目之一上将Shoulda与Test::Unit结合使用。我遇到的问题是我最近更改了此设置: class MyModel :update end 以前,我的(通过)测试看起来像这样: c
我该如何做 or使用 chai.should 进行测试? 例如就像是 total.should.equal(4).or.equal(5) 或者 total.should.equal.any(4,5)
如果您要将存储库 B 中的更改 merge 到存储库 A 中,是否应该 merge .hgtags 中的更改? 存储库 B 可能具有 A 中没有的标签 1.01、1.02、1.03。为什么要将这些 m
我正在尝试执行X AND(y OR z)的查询 我需要获得该代理为上市代理或卖方的所有已售属性(property)。 我只用 bool(boolean) 值就可以得到9324个结果。当我添加 bool
我要离开 this教程,尝试使用 Mocha、Supertest 和 Should.js 进行测试。 我有以下基本测试来通过 PUT 创建用户接受 header 中数据的端点。 describe('U
我正在尝试为 Web 应用程序编写一些 UI 测试,但有一些复杂的问题希望您能帮助我解决。 首先,该应用程序有两种模式。其中一种模式是“训练”,另一种是“现场”。在实时模式下,数据直接从我们的数据库中
我有一个规范: require 'spec_helper' # hmm... I need to include it here because if I include it inside desc
我正在尝试用这个测试我在 Rails 中的更新操作: context "on PUT to :update" do setup do @countdown = Factory(:count
我还没有找到合适的答案: onclick="..." 中是否应该转义 &(& 符号)? (或者就此而言,在每个 HTML 属性中?) 我已经尝试在 jsFiddle 和 W3C 的验证器上运行转义和非
import java.applet.*; import java.awt.*; import java.awt.event.*; public class Main extends Applet i
我是一名优秀的程序员,十分优秀!