作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要确保服务器上我的python部署位置之一始终与远程分支同步,并删除服务器上的所有更改。选项1和选项2有什么区别?首选哪一个?我打算及时运行此命令,以确保服务器代码与远程同步。
选项1:
git clean -f -x
git fetch --all
git reset --hard origin/master
git clean -f -x
git fetch --all
git checkout --force origin/master
最佳答案
为了正确理解差异,让我们从以下定义开始:
deadc0defeedbeefac0ffee...
等标识。因为这些大的丑陋的哈希ID大,丑陋且看似随机,所以我们使用名称(主要是分支名和标记名)来跟踪它们。git add
的作用:它将文件复制到索引中,或者替换现有文件(如果文件的路径名以前在其中)或存储一个全新的文件(如果路径名是新文件)。git rm
。默认情况下,这会同时从索引和工作树中删除该文件(但是您可以告诉它不理会工作树的版本)。 .git/HEAD
(它是.git
目录中的一个普通文件)的真正工作方式是通常只包含当前分支名称。实际的提交ID存储在分支名称下。但是,Git具有所谓的“分离式HEAD”模式,其中HEAD
包含哈希ID。对于git checkout
和git reset
来说,这一切都很快。 HEAD
,它的缩写为:“嘿,Git,去阅读
.git/HEAD
,找到当前的分支名称,并使用它来查找当前的提交。或者,如果我处于分离式HEAD模式,请像以前一样阅读
.git/HEAD
,但请注意,它具有一个哈希ID,然后是当前提交。”
git reset
和
git checkout
。这些目标有很大不同:
git reset
(主要是2)是关于以某种方式更改当前分支名称的名称到ID的映射,还可以选择更改索引,甚至更改以下三个:当前提交,索引和工作树。 。 git checkout
(主要是)通过将新的分支名称写入HEAD或“分离” HEAD,来更改哪个分支是当前分支:将提交哈希ID写入HEAD。在此过程中,git checkout
将同时更改索引和工作树。 --hard
,所以
git reset
将更新索引和工作树。所以现在听起来更像是
git checkout
,并且在某些方面更是如此。但是有几个关键的区别:
git reset
更改将提交当前分支指向。使用git checkout
可以更改当前的提交。master
和develop
这样的名称是让Git记住大的丑陋哈希ID的方式。效果是这些名称的行为就像标签一样,粘贴或指向特定的提交。 git reset
命令使您可以移动标签:更改其指向的位置;将其从一个特定的提交剥离并粘贴到另一个。相比之下,git checkout
不会移动标签。而是更改哪个分支名称存储在.git/HEAD
中。您可以使用git checkout master
切换到分支master
,然后使用git checkout develop
切换到分支develop
。标签保留在原处,但是Git更改了存储在.git/HEAD
中的名称。git reset
仍会将分离的HEAD从一个提交移至另一个提交,但是由于不涉及分支名称,因此不会更改任何现有的分支名称。同样,如果您用git checkout
表示的不是分支名称,则git checkout
通过将原始提交ID写入.git/HEAD
来“分离您的HEAD”。git reset
永远不会分离HEAD,也永远不会重新连接HEAD。那是git checkout
所做的。同时,git checkout
永远不会更改任何分支标签,但是git reset
不会更改。 git checkout
命令尝试无损(无论如何在这种模式下;请再次参见脚注2)。 git reset
命令愉快地破坏了未保存的工作。git checkout
不会覆盖它们。这变得特别复杂,因为如果可能的话,它将切换分支或提交。这样做是通过将未保存的工作保留在索引和/或工作树中的位置(如果可以)。如果不能,则只会出错。git reset --hard
将丢弃这些未保存的更改:--hard
意味着覆盖索引和工作树。 I want to ignore any commits that anyone might have made on the server (even though that is unlikely)
--bare
存储库。没有工作树的存储库无法在其中完成任何工作。首先,没有什么可以保存,可以忽略或可以丢弃的。如果使用此方法,所有这些区别将消失。那是你最好的选择。
--bare
信息库,我们也要看看其余的项目。除了上述所有注意事项之外,请记住,一个集中存储库-有人
git push
首先向其提交新提交-仍然有一个当前(HEAD)提交,如果未分离,则将其命名为当前分支。它还有一个索引,即使不是裸露的,也有一个工作树。 Git通常会拒绝推送到工作树的当前分支:请参阅
the receive.denyCurrentBranch
documentation中的
git config
。由于裸存储库没有工作树,因此对于裸存储库,这个特定的Git问题也消失了。
git fetch
。如果是这种情况,请注意以下几项成为非问题。)
git reset
和
git checkout
与之相比更接近表亲。你在树枝上。
git reset --hard origin/master
和
git checkout origin/master
之间的主要区别是未提交的索引和/或工作树修改发生了什么。使用
git reset --hard
,它们将被清除,而不会发出警告。在服务器上积极工作的任何人都将是
SOL。索引和工作树将被重置以匹配新提交。
git reset --hard origin/master
会将
origin/master
的提交ID写入当前分支名称。和以前一样,
git reset
也将更新索引和工作树。通过将分支标签从旧提交上剥离并粘贴到新提交上,这不仅清除了 Activity 的工作,而且还丢弃了在当前分支上进行的提交。
git checkout
,这也有点复杂。由于
origin/master
是所谓的远程跟踪分支,因此 check out 此名称将为您提供一个分离的HEAD,并将提交哈希直接存储在
.git/HEAD
中。不管是否已连接或分离HEAD,这都是正确的。因此,如果 checkout 成功,现在
HEAD
是分离的。如果索引和工作树中没有未提交的更改,则 check out 应该成功。如果存在未提交的更改,则 check out 将在可能的情况下将它们带到新的分离的HEAD上,如果在不清除未提交的工作的情况下无法切换到该提交,则结帐失败。
git clean -f -x
将删除未跟踪和忽略的文件,即索引中未包含的内容。但是,如果没有
-d
,则不会删除未跟踪的目录。)
git checkout --orphan
创建一个新的但未出生的分支(如Git所称)。
git reset
和
git checkout
都有其他用法,它们的主要功能可能有所不同。我在这里仅描述其主要功能。
git checkout
仍然可能由于例如磁盘空间不足而失败。
关于git - 使用GIT部署代码- checkout vs重置-难吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42569205/
我想根据用户在第一个下拉框中选择的值来填充第二个下拉框。这是我到目前为止所做的: 在 PHP 文件中: function displayDropDown() { $table_tester =
我需要你的帮助。 我有一个具有如下架构的数据库: 团队: ID 姓名 fundation_date 匹配: ID 日期 id_local_team(团队的外键) id_visit_team (团队的外
我是一名优秀的程序员,十分优秀!