- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写预提交/预推送脚本
但是脚本只应对分阶段的更改起作用
为此,我使用git stash push --keep-index
删除未进行的更改
然后git stash pop
在脚本之后重新应用它们
但是,如果同一行上有已暂存和未暂存的更改,git stash pop
将始终创建合并冲突。例如,
$ echo "print('a')" >> main.py # main.py already exists
print('a')
$ git add main.py
$ sed -i 's/a/b/g' main.py # now it's print('b')
$ git status --short
## master
MM main.py
$ git stash push --keep-index
Saved working directory...
$ git stash pop
Auto-mergin main.py
CONFLICT (content): Merge conflict in main.py
最佳答案
TL; DR
像这样在使用git reset --hard HEAD
进行申请之前,您需要先--index
(或任何等效项)。所有有关硬重置的常见警告均适用。
长
我在注释中链接到How do I properly git stash/pop in pre-commit hooks to get a clean working tree for tests?,该注释显示了如何进行最终弹出(或等效操作),以及有关此方面的一些注意事项。但是,所提出的问题的答案(特别是在应用存储时如何强制git使用快进)是您无法做到的,实际上,这个问题甚至没有道理:快进是从藏匿和解散不同的概念。1
Git隐藏只是一组特殊安排的提交(两次,除非您使用--all
或--include-untracked
选项,否则您将获得三个)。提交保存:git stash
时的索引(使用git write-tree
);git stash
时的工作树内容(使用相当复杂的代码);
列表中的最后一个,但实际上更早完成,如果您确实使用了--all
或--include-untracked
,则未跟踪的文件包括忽略的文件(--all
)或未跟踪的文件排除了忽略的文件(--include-untracked
) 。
然后,Git重置工作树(通常与HEAD
提交匹配),如果使用了--all
或--include-untracked
,则也会删除存储在第三次提交中的文件。但是,当您使用--keep-index
时,Git会重置工作树以匹配索引内容。
名为refs/stash
的引用被修改为指向工作树提交。此提交作为其父级,有HEAD
提交(父级#1),索引提交(父级#2),以及未跟踪的文件提交(父级#3)(如果存在)。索引具有HEAD
提交作为其父项。未跟踪的文件提交没有父提交(是根提交):
...--o--o--o <-- refs/heads/somebranch (HEAD)
|\
i-w <-- refs/stash
/
u
u
的情况相同。
git stash
重置为
HEAD
时(即没有
--keep-index
),您要做的所有操作都是撤消
git stash
(注意:不是
git stash pop --index
!)。这将使用相同的选项和参数运行
--keep-index
2,如果成功运行且没有合并冲突,则将在同一存储库中运行
git stash apply
。
git stash drop
告诉Git使用
--index
将索引提交(对当前索引内容进行比较)应用于当前索引内容。如果失败,
git apply --index
将停止并且不执行任何操作。在此我建议使用
git stash
将存储库转换为新分支,尽管
git stash branch
仅建议不使用
git stash
.3进行申请。
--index
的情况下进行藏匿,并且未对当前工作树进行任何更改,则此操作将始终成功:当前索引并且工作树将匹配
--keep-index
提交,因此这将使当前索引保持不变,并将工作树提交中的所有差异应用于工作树本身,从而恢复了已隐藏的工作树。
HEAD
,所以当前的工作树与您设置的索引匹配,而不是与
--keep-index
提交匹配。因此,在应用存储(带有或不带有
HEAD
)之前,必须首先重置工作树以匹配
--index
提交,即
HEAD
。所需的索引和工作树状态位于您将要应用的存储中,因此只要当前索引和工作树没有被您拥有的任何预提交/预推送代码修改,这是安全的。 。
git reset --hard
将同时还原索引和工作树(对链接的问题中的错误进行模化!)。
git apply --index
的参数默认为
git stash apply
。如果给它提供任何参数,则该行为有点幻想:在最新版本的Git中,如果给它一个全数字的参数n,它将检查
refs/stash
,否则将使用您给它的任何值。它将此字符串传递给
stash@{n}
以确保将其转换为有效的哈希ID,并在后缀
git rev-parse
,
:
,
^1
,
^1:
和
^2
时将其也转换为有效的哈希ID。如果字符串使用
^2:
和
^3
生成有效的哈希ID,则这些ID也将被记住。它们共同构成
^3:
,
w_commit
,
w_tree
,
b_commit
,
b_tree
和
i_commit
,如果存在则加上
i_tree
和
u_commit
。有关更多信息,请参见
the gitrevisions documentation。
u_tree
的任何参数都必须具有合并提交的形式,并且至少有两个父级。 Git不会检查预期三者之外是否还有其他父母,也不会检查合并提交是否确实是藏匿处:它只是假设如果它具有正确的父母年龄,您打算将其用作一个。
git stash apply
或
--index
上使用
git stash apply
而不理解的Git新手来说足够明智。但是,一旦您了解了索引,就很明显是错误的:您想将相对于当前索引,当前索引的隐藏索引的更改还原,而不是完全忽略它们!如果合适的话,提交当前索引,如果合适的话,提交当前工作树,然后将存储区变成一个分支并提交其工作树,将为您提供构建正确的最终结果所需的一切。
git stash pop
(这是实现
git merge-recursive
的方法)和一些秘密环境变量来设置冲突标记上的名称(如果存在冲突)。合并基础是创建存储时的
git merge -s recursive
提交,当前树是写入当前(在非存储时)索引的结果,并且要合并的项目是工作树提交,或者更确切地说,是它的树。这利用了一些合并可以在未提交更改的情况下运行的事实。前端
HEAD
命令禁止使用未提交的更改进行合并尝试,因为在出现问题时结果可能非常混乱。
git merge
返回零退出状态时,分支名称更新才是快进。
git merge-base --is-ancester $old_hash $new_hash
执行这些快进操作之一时,这意味着Git已将
git merge
提交更改为指向新的哈希,并且还根据需要更新了索引和工作树。如果您要在存储库中快速前进到工作树提交,那将在Git的其余部分暴露出奇怪的技术上合并的工作树提交,至少这会非常混乱。
HEAD
和
git fetch
也可以执行快进操作,或者与
git push
一起使用,可以对分支和(用于获取)远程跟踪名称进行非快进更改。推送的接收者通常需要快进,因为这意味着更新的分支名称包含它曾经使用过的所有提交以及一些其他提交。强制的非快进更新会丢弃分支中的提交(无论是否添加新提交)。有点神秘的
--force
输出记录了远程跟踪名称是通过三种(!)方式快速转发还是强制的:
$ git fetch
remote: Counting objects: 1701, done.
remote: Compressing objects: 100% (711/711), done.
remote: Total 1701 (delta 1363), reused 1318 (delta 989)
Receiving objects: 100% (1701/1701), 975.29 KiB | 3.65 MiB/s, done.
Resolving deltas: 100% (1363/1363), completed with 284 local objects.
From [url]
3e5524907..53f9a3e15 master -> origin/master
61856ae69..ad0ab374a next -> origin/next
+ fc16284ea...4bc8c995a pu -> origin/pu (forced update)
9125ddae1..9db014fc5 todo -> origin/todo
* [new tag] v2.18.0 -> v2.18.0
* [new tag] v2.18.0-rc2 -> v2.18.0-rc2
git fetch
的行前面的
+
,并添加了单词
origin/pu
。那是三种方式中的两种。但是,请注意两个缩写提交哈希之间的点:不是强制更新的所有其他行都显示两个点,但是此更新显示三个点。这是因为我们可以使用
(forced updated)
或
git rev-list
并使用相同的三点语法来查看添加和删除的提交:
$ git log --oneline --decorate --graph --left-right fc16284ea...4bc8c995a
> 4bc8c995a (origin/pu) Merge branch 'sb/diff-color-move-more' into pu
|\
| > 76db2b132 SQUASH????? Documentation breakage emergency fix
| > f2d78d2c6 diff.c: add white space mode to move detection that allows indent changes
| > a58e68b88 diff.c: factor advance_or_nullify out of mark_color_as_move
[massive snippage]
< fc16284ea Merge branch 'mk/http-backend-content-length' into pu
|\
| < 202e4a2ff SQUASH???
| < cb6d3213e http-backend: respect CONTENT_LENGTH for receive-pack
< | 4486a82e5 Merge branch 'ag/rebase-p' into pu
< | a84cc85f3 Merge branch 'nd/completion-negation' into pu
[much more snippage]
git log
选项以及三点语法告诉Git标记提交来自哪一面。在这种情况下,
--left-right
提交现在位于拾取分支上,并且
>
提交已被删除。这些特定的已删除提交现在完全未被引用,将很快被垃圾回收。
关于git - 应用 stash 时如何强制git使用快进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51004400/
我一直很难编辑我的 .htaccess 文件来一起做这三件事。我已经能够分别获得每个部分,但我只是不明白逻辑流程如何使它们全部工作。 这是我能够使用 bluehost support 上的演示进行整合
我制作的宏将模板工作簿保存为两个单独的文件。每个测试保存一个(位置 1、2、3 或 4),然后在另一个宏中使用每个测试的数据。第二个是保留用于备份的原始数据文件。现在的问题是每次我在每个位置运行测试并
我正在写一篇关于如何使用 OCaml 的模块系统而不是 Java 的 OO 系统(一个有趣的视角)的博客文章。我遇到了一些我不理解的关于强制的事情。下面是一个基本模块和两个包含它的模块: module
我有一段将被执行多次(5,000+)的代码,以及一个仅在第一次为真的 if 语句。我曾想过使用“FIRST”变量并每次都进行比较,但每次都检查它似乎是一种浪费,即使我知道它不需要。 bool FIRS
首先,我是 Perforce 的新手,我主要通过其文档进行学习。 因此,我们即将从 CVS 迁移到 Perforce,我最近学到了一个避免更改每个工作区的 P4CLIENT 的好方法,即在工作区根目录
我正在为一段代码编写测试,其中包含我试图涵盖的 IOException 捕获。 try/catch 看起来像这样: try { oos = new ObjectOutputStream(new
我正在尝试在新闻项目滚动之间添加延迟。我知道 $.each() 通过不等待动画完成来完成其工作,但我想知道如何制作它,以便一次向上滚动一个项目并等到最后一个动画完成后再继续在循环中。 $(functi
假设已经编写了一个方法,需要一个排序列表作为其输入之一。当然这将在代码中进行注释和记录,param 将被命名为“sortedList”,但如果有人忘记,则会出现错误。 有没有办法强制输入必须排序?我正
我正在尝试将传入请求重定向到 https://www.domain.com/和所有 https://www.domain.com/ {所有页面}并且没有什么麻烦。我试过的方法: 添加此行:Redire
我将如何实现以下内容: title_selection = raw_input("Please type in the number of your title and press Enter.\n%
我有一个登录表单,我需要强制关闭自动完成功能。我试过了 jquery: $('#login').attr("autocomplete", "off"); HTML: Javascript:docume
我想知道我应该怎么做才能强制从 dev 分支 merge 到我的 master 分支?使用“git merge dev”会导致很多冲突。但是,我不想单独处理它们。相反,我只是想使用我的 dev 分支中
当安装 Hl7.Fhir.DSTU2 和 Hl7.Fhir.R4 这两个 Nuget 包时,我们得到如下信息: DSTU2 包似乎在使用 Hl7.Fhir.Support.Poco 版本 3.4.0
我正在尝试让一个功能组件在 testFn 执行时强制重新渲染。我想使用状态来做到这一点(如果有更好的方法请说出来),这似乎成功地强制重新渲染但只有两次,然后什么都没有。 我构建了一个简单的演示来模拟这
默认情况下,g++ 似乎会省略未使用的类内定义方法的代码。示例 from my previous question : struct Foo { void bar() {} void baz(
我正在尝试使用 here 中介绍的技术使我的网站背景以比内容慢的速度滚动。我不希望背景固定,只希望更慢。 这是 HTML 的样子: .parallax { perspective: 1px;
我能找到的最相似的问题是 'how to create a row of scrollable text boxes or widgets in flutter inside a ListView?'
我有以下 eslint 配置: "object-curly-newline": ["error", { "ImportDeclaration": "never",
我正在使用 TinyMCE 插件并将 valid_elements 选项设置为: "a[href|target:_blank],strong/b,em/i,br,p,ul,ol,li" 即使没有列出数
您好,我想使用以下命令放置多行描述 p4 --field Description="MY CLN Header \\n my CLN complete description in two -thre
我是一名优秀的程序员,十分优秀!