- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 Gitk 中,我可以看到团队成员的提交 (X) 有两个父项,第一个父项是他自己之前的提交 (A),另一个父项包含许多其他人的提交(1 到 5)。在他 merge 之后,其他人(1 到 5 和其他人)所做的所有更改都不再存在于 X、B、C 等...
A------------
\
X - B - C
/
1--2--3--4--5
/
e--r--j--k
/
l--m
如果我将提交 X 与提交 A 进行比较,它不会显示任何差异,如果我将提交 X 与提交 5 进行比较,它会显示所有缺失的更改。此外,在提交 X、B 或 C 时,git log 不会显示提交 1 到 5 中对文件所做的更改。但是,如果我执行 git log --full-history,那么历史记录会显示在 1 中所做的更改到 5,但这些更改仍未出现在实际文件中,并且历史记录未显示它们正在撤消。所以 git log --full-history 似乎与当前文件内容相矛盾。
我与提交 X 的用户进行了交谈。他说他没有进行重置或 rebase ,并且他说他在相关时间内没有还原任何提交。然而,他说他有时会做一个 pull origin master,导致其他人的更改被放入他的索引或工作树中,就好像他做了这些更改,而不是这些更改的实际作者。他说,当发生这种情况时,他做了一个新的克隆,并且没有将任何内容从本地存储库推送到 master,因为他认为 Git 做错了什么。
这两件事是否相关(错误的 pull 和错误的 merge )?
我怎样才能准确地说出发生了什么,以便我们将来可以避免这种情况?
是什么原因导致 Git 有时将从 origin master pull 的更改放置在本地工作目录或索引中,就好像它们是本地更改一样?
最佳答案
However, he says that he does sometimes do a pull origin master that results in everyone else's changes getting put in his index or working tree as if he had made those changes and not the actual authors of those changes.
听起来他遇到了 merge 冲突,但不明白它们是什么。这是一个极其常见的问题,不幸的是,我们不知道避免它的好方法(例如,切换回 SVN 并不能避免它)。
让我们称呼您的开发人员 Alice 和 Bob。 Alice 提交了 1-5,Bob 提交了 A 和 X。这是一个似是而非的历史。
Bob 提交 A。
Alice 提交 1-5,并将它们推送到中央存储库。
Bob 尝试推送 A,但无法推送,因为他的存储库已过时。
$ git push
! [rejected] master -> master (non-fast-forward)
Bob 然后他按照您告诉他的去做:他先 pull 。但是,他遇到了 merge 冲突,因为提交 A 和提交 1-5 触及了一些相同的代码。
$ git pull
Auto-merging file.txt
CONFLICT (content): Merge conflict in file.txt
Automatic merge failed; fix conflicts and then commit the result.
Bob 在他的工作目录中看到其他人所做的更改,但不明白为什么会出现这些更改。
$ git status
both modified: file.txt
他认为 Git 做错了什么,而实际上,Git 要求他解决 merge 冲突。他尝试 checkout 新副本,但出现错误:
$ git checkout HEAD file.txt
error: path 'file.txt' is unmerged
因为它不起作用,他尝试 -f
:
$ git checkout -f HEAD file.txt
warning: path 'file.txt' is unmerged
成功!他 promise 并 push 。
$ git commit
$ git push
有很多 git 工具。严重地。 Visual Studio 和 Xcode 都集成了 Git,还有其他几个 GUI,甚至还有多个命令行客户端。人们在描述他们如何使用 Git 的方式上也很草率,而且大多数开发人员对 Git 在“pull 提交推”工作流程之外的工作方式不太满意。
不久前有一篇关于这个主题的优秀论文(我很难找到它)。一些结论是(原谅我的内存):
除了一些非常简单的命令(提交、推送)之外,大多数开发人员并不真正了解如何使用源代码控制。
当源代码控制未按开发人员预期的方式运行时,他们会采取一些策略,例如复制粘贴一些他们不太了解的命令来“修复问题”,添加 -f
标记,或删除存储库并使用干净的副本重新开始。
在开发团队中,通常情况下只有首席开发人员才真正知道存储库中发生了什么。
所以这确实是一个教育挑战。
我认为 Bob 需要学习的关键教训是 git pull
实际上只是 git fetch
和 git merge
,而且您可能会遇到 merge 冲突,并且在解决 merge 时需要以非常认真和有目的的方式行事。即使没有报告冲突,这也适用......但现在让 Bob 不要太过担心!
这里的另一个重要教训是,首席开发人员需要花时间确保团队中的每个人都能正确使用源代码控制,并了解 pull 、推送、分支和 merge 之间的关系。这是午餐时间讲座的绝佳机会:整理一些幻灯片,买披萨,并讨论 Git 的工作原理。
关于git - 我如何知道在没有 merge 来自第二个父项的更改的两个父项的 Git 提交中发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28079546/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!