- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
初学者问题:
我最近一直在本地进行大量开发,然后今天进行了git pull(我知道我应该做得更多),并且引入了许多更改和不同的冲突。我解决了冲突,并将所有提交压缩为1(拉出的提交穿插了)。现在,当我将拉出的提交的更改发送出去进行审核时,我的 promise 也很大。我试图找到一种方法来解决这个问题,并将我的提交与那些提交分开。
例:
我的 promise :
原始-> A1-> A2-> A3
远程提交:
原始-> B1-> B2-> B3
合并:
原始-> A1-> B1-> A2-> B2-> A3-> B3
使用Git Rebase,我将提交压缩为1个提交C1:
原始-> C1
现在我的提交涵盖了从A1到A3和B1到B3的所有更改。
任何想法如何区分出更改或解决此问题?
最佳答案
作为Andrew C noted in a comment,您可以通过显示您使用的实际命令来帮助回答者。不过,在这种情况下,我可以猜到您做了什么。
您从本地存储库开始与origin
同步,如下所示:
...- o <-- HEAD=develop, origin/develop
o
是标记为
original
的内容。 (我不得不在这里猜测该分支的名称为
develop
并跟踪
origin/develop
,因此这些名称可能与您使用的名称不同。)
git add
编码,然后对
git commit
进行编码,以生成以下内容:
A1 - A2 - A3 <-- HEAD=develop
/
...- o <-- origin/develop
A3
指向
A2
,
A2
指向
A1
,而
A1
指向
o
。原因很简单:“指向”是通过将先前提交的SHA-1 ID存储在新提交中来完成的。一旦将提交实际存储在存储库中,就无法再更改。这意味着在创建
A1
时,
A2
不能指向尚不存在的提交(例如
A1
)。它只能指向确实存在的提交(例如上面的
o
)。稍后,当创建
A2
时,它可以指向
A1
,因为它现在已经存在,但是
A1
无法更改为指向
A2
.1。
git pull
,您没有以任何方式对其进行重新配置,因此
git pull
运行了
git fetch
(始终如此),然后运行了
git merge
(如果您不告诉它重新设置基准,也是如此)。
fetch
步骤从
origin
获得了一些新的提交:2
A1 - A2 - A3 <-- HEAD=develop
/
...- o - B1 - B2 - B3 <-- origin/develop
merge
步骤在当前分支(
develop
)上添加了合并提交,将“他们的东西”与“您的东西”组合在一起:
A1 - A2 - A3 - M <-- HEAD=develop
/ /
...- o - B1 - B2 - B3 <-- origin/develop
git log
的情况下运行
--graph
,则它喜欢按日期顺序对提交进行排序,因此根据时间,您可能会看到以下内容:
M merged origin/develop into develop
B3 their message for B3
A3 your message for A3
B2 [etc]
A2
B1
A1
o
git log
与
--graph
一起使用,则
log
命令会首先根据图形进行排序,并且将以更明智的方式(无论如何以图形方式)显示提交,而不是“提交日期/时间”顺序。
git rebase -i
,并将很多
pick
命令更改为
squash
。虽然rebase通常被描述为“更改”或“重写”提交,但其真正作用是复制提交。它必须,因为不能更改提交。因此,对于每个提交,rebase都从复制该提交所做的操作开始(但没有完全提交),然后进行一些更改(通常是很小的更改,但也可以是非常大的更改),然后才从结果中进行新的提交。当您将rebase告诉
squash
时,它将延迟3先前的提交,直到还包括要压榨的提交的更改。通过压缩所有提交,新副本仅是一个提交,它包含每个提交完成的所有工作(
A1
通过
A3
加上
B1
通过
B3
加上合并
M
)。
C1
。但是,由于这是一个新提交,并且git默认将旧提交保留一个月左右,因此旧提交仍在其中。 git所做的是使您的
develop
分支名称指向新提交:
A1 - A2 - A3 - M <-- [invisible, but still there]
/ /
...- o - B1 - B2 - B3 <-- origin/develop
\
C1 <-- HEAD=develop
develop
以指向
M
或
A3
(目前尚不清楚)。只要它们仍在您的存储库中,就很容易做到:唯一的技巧就是找到
M
或
A3
(无论您要还原的是什么)的SHA-1。
HEAD
本身还有一个附加的reflog。命令
git reflog
将为您显示特定reflog的内容,或者默认情况下为
HEAD
:
git reflog develop
git log
的输出(实际上
git reflog
只是使用几个选项调用
git log
,包括
-g
,这是
--walk-reflogs
的简短版本)。这将使您找到所需的SHA-1。
git checkout develop
,假设分支是
develop
,不会伤害任何东西,在这种情况下只会说
Already on branch 'develop'
-使用
git reset --hard sha1
:
git reset --hard 1234567
1234567
)。这将使您当前确定为
develop
的当前分支指向commit
1234567
。也就是说,现在不是
M
不可见了,而是假定
1234567
是
M
的ID,而
C1
是不可见的:
A1 - A2 - A3 - M <-- HEAD=develop
/ /
...- o - B1 - B2 - B3 <-- origin/develop
\
C1 <-- [invisible]
C1
,而不是
M
。
reset --hard
标识为
A3
的ID,则
develop
将指向
A3
,从而使
M
和
C1
均不可见:
A3 <-- HEAD=develop
/ \
A1 - A2 M <-- [invisible]
/ /
...- o - B1 - B2 - B3 <-- origin/develop
\
C1 <-- [invisible]
develop
指向的位置。 (
HEAD
在所有情况下都只包含名称
develop
。在每条命令中,git都会打开文件
HEAD
,看到它说为“develop”,然后立即忽略
HEAD
并直接使用
develop
。)
git rebase
到新开发分支的尖端。和以前一样,
rebase
只是复制;让我们通过
A1
复制
A3
(这次不可见的
M
完全不可见):
A1 - A2 - A3
/
...- o - B1 - B2 - B3 <-- origin/develop
\
A1' - A2' - A3' <-- HEAD=develop
'
等中的“prime”或
A1'
标记表示它们是副本(需要进行任何更改,首先将其应用于
B3
而非
o
,其次,指向
B3
,然后指向
A1'
, 等等)。
M
结尾的序列。这不是一个单一正确答案的问题:这取决于您,以及谁正在审查/接受代码,以及如何做到这一点。 (复数形式也取决于您,即“差异太大”的含义是什么。)
git pull
实际上确实使用
git fetch
,但是在较旧的版本中,
git pull
调用
git fetch
的方式告诉
git fetch
不要更新
origin/develop
远程跟踪分支。如果您手动运行
git fetch
,它会更新远程分支;在1.8.4或更高版本中,即使从
git pull
运行,它也会更新远程分支。
rebase
实际上进行中间提交,然后将其复位一次,因此您获得了一堆中间提交。看起来好像延迟了提交。这符合git尽可能多地提交的内部哲学。 :-)
关于git - Git初学者:分离Git提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26172787/
我在尝试使用 jpa2.0 将包含持久实体和分离实体(新创建的实体)的实体列表更新到我的数据库中时遇到错误。 我的实体包含在合并数据时出现错误(在标题中提到)的内部实体: Class supercla
我在分层 Pane 中有一组面板。我需要一个分隔符来将 sideBar 与 topBar 和 tabbedPanel 分开。我留了一个 10 像素的缓冲区来放置它。不幸的是,可能由于它是 JLayer
在我从数据库中读取的代码中,我还使用自定义适配器打印出每一行,该行中有一个 texttview、2 个按钮和一个 edittext。这一切都很好,但是当按下按钮时,edittext 会递增或递减,有没
我有一个由 Hibernate 4.3.4 管理的实体,它有一个其他实体的一对多集合。 在我的处理过程中,我必须分离父实体(将分离级联到子列表)。但是,当我向列表中添加一个尚未持久化的新项目并执行分离
我想追加一行,该行应该是表格的最后一行。在我的代码中,它似乎在第一次动态添加行时起作用。但是当添加其他行时它不会成为最后一行。 我总是希望“subtot”行成为最后一行,但是当我追加其他行时,它不
我试图用它们之间的空格分隔这 2 个 div(请参见图 1)。问题是当我添加边距或填充时会发生这种情况(请参见图 2)。 这是我的代码,请注意我没有使用 Bootstrap: .row { mar
我的服务器包含一些 ServerActor。该 actor 接收 RegisterClient 消息并将 ActorRefs 添加到已注册客户端列表中。 我还有多个客户端,每个客户端都包含 Clien
假设我有一个需要两个参数的函数,并且参数的顺序会影响结果。 是否可以将第一个参数传递给 partial 或 comp 函数,然后将另一个参数传递给它,如下所示: (defn bar [arg1 arg
如何搜索和分离多个后代键。 例子: (def d {:foo 123 :bar { :baz 456 :bam { :w
我正在尝试为 Slick 表创建一个类型安全的动态 DSL,但不确定如何实现这一点。 用户可以通过以 form/json 格式发送过滤器来将过滤器发布到服务器,我需要使用所有这些来构建一个 Slick
我是新来的,我发现看到充满大量函数和变量初始化以及 UI 的组件时眼睛很痛。是否可以将它们分开? 而不是默认设置,如下所示。如何将业务逻辑分离到另一个文件中? function MyComponent
我试图通过将参数粘贴在一起来使用分离。这应该是一件容易的工作,但不适合我。当我想到使用 eval(parse()) 时,我知道是时候寻求帮助了 通常,如果我加载一个包,我可以按如下方式分离它: det
(dissoc :a m)允许我解除给定的键。但是,有没有办法使用谓词函数来分离 pred 为真的任何键? (dissoc-with-pred pred? m) 所以给了一张 map - {:a 2
我编写了一个使用 devtools 来包含内部数据的包: devtools::use_data(.data, internal = T, overwrite = T) 我最近更改了该数据并重建了包。我
所以我有一个脚本,我想在我的服务器上运行它而不会打扰我。所以我想我会在 tmux 窗口中运行服务器,然后 detach这样我就可以简单地 attach如果我想查看进度(此脚本需要数天才能运行)。 但是
ThreeJS中动画数据和模型数据是否可以解耦? 这样就可以交换模型并保留动画?我认为这可能非常强大 我知道如何在 ThreeJS 中做到这一点的方法是将每个动画一个接一个地打包在一个模型中,这似乎是
我有一堆(Ruby)脚本存储在服务器上。到目前为止,我的团队通过打开一个启动脚本名称列表的访问器应用程序来使用它们,然后他们在工作文件夹中的文件上选择要在该实例中运行的脚本。脚本直接从服务器运行,因此
我想知道 javascript 如何包含在 jsp 中 - 我们是否可以在 .js 文件中放置 jsp 能够识别的任何代码,而不仅仅是 javascript 代码? 我有一些常见的 JavaScrip
您是否可以在 Dockerfile 中指定一个选项,默认使用它构建的容器以分离方式运行。 这将导致与 -d 相同的结果: docker run -d 这样 docker run 默认情况下会分离运
我正在为现有的 Java 程序开发 Java 插件。现有程序使用特定版本的 eclipse.uml2.*,我的插件也是如此。不幸的是,我的插件需要更新版本。 为了运行该插件,我需要将其导出到 Jar
我是一名优秀的程序员,十分优秀!