Git –让我们犯错误(并学习如何还原错误)

git不是一个非常容易使用的工具并不是什么秘密。 我可以或多或少地使用它; 但是我总是对发生的事情感到有些害怕和困惑。 我觉得我想要更多信息。 我遵循了一些教程,分心地阅读了一些书,但是由于信息太多, 我最终总是以自己可以做自己想做的事情为自己的感觉。 但是我不知道该怎么做。 我想解决这种情况,因此我开始进行更多调查,并且试图将一些关键概念牢记在心,希望永远不会忘记它们。

让我开始为我的消息来源提供感谢: http : //osteele.com/posts/2008/05/my-git-workflowhttp://longair.net/blog/2009/04/16/git-fetch-然后合并/。 我发现这些文章有趣而有用,特别是第一篇,但他们已经在说
我需要太多简化模型的东西。 假设您已经是git用户 。 您有一个本地存储库,一个远程存储库用于拉动您的工作。 您还知道分支的存在,并且正在使用它们。 但是,尽管有了这些基本知识,您仍会不确定自己的行为。

我猜想,造成混乱的关键之一是临时区域的作用 。 请注意,在我的讨论中,我正在对此有所了解 ,并且我可能是错的。 但是,尽管如此,我仍可以在此概念上加深了解,并能够为自己提供背后的理由,这有助于我对该工具产生信心。

我喜欢在暂存区域中思考((执行git add操作时跟踪修改的位置,作为执行“ 更轻便的提交 ”的方式。我指的是更轻便的提交是,因为您不必强制执行)在此操作上发表评论,您的约束更少了,并且由于您甚至还没有保存操作,因此显然建议您执行多于 提交的操作,而不是 提交 。让我们为添加用例提供一个方案:添加过程代码库的一些新功能;它可能涉及创建新文件,而这些想法只是以无序的方式出现在您的脑海中。

举个例子,让我们假设您正在创建两个相互引用的文件。 也许是源代码文件及其配置文件。 您创建第一个 ,并开始对其进行操作。 完成工作后,您可以考虑提交它, 但是由于逻辑工作单元只有在您还创建配置文件才能完成 ,因此您有机会执行上述的“更轻松的提交”,即简单的添加。 完成配置文件的工作后,必须将其添加到索引中,然后就可以提交它。 或者,如果您愿意,可以执行git commit -a获得相同的结果。 由于我们已经给出了登台区域的用例,因此应该更容易地确定它在git工作流程中的作用。 这是逻辑上的位置,位于当前未跟踪的目录和已提交(且安全)的存储库之间。 我们称其为“地点”,因此我们可以假设我们有兴趣与之互动。 将事物放入其中的众所周知的方法是命令:

git add

并且它具有2个伴随的命令,您将经常使用它们:

git diff

顾名思义,它列出了差异。 但是哪一个呢? 它以不带参数的形式列出您当前文件夹和暂存区之间的差异。

touch test.txt
echo 'text' >> test.txt
git add test.txt
echo 'added1' >> test.txt
git diff

返回此输出:

gittest$ git diff

diff --git a/test.txt b/test.txt
index 8e27be7..2db9057 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1,2 @@
 text
+added1

好的,现在我们可以看到工作文件夹和跟踪上下文之间的差异。 显然,我们可以使用add命令跟踪新修改,但我们也希望有机会放弃修改 。 这是用

git checkout .

Git签出,不带参数 (“ dot”以外的其他参数 ,代表当前文件夹)将放弃对文件的修改,并使用先前的add命令将状态恢复为登台区域中跟踪的状态

gittest$ git status

# On branch master
# Changes to be committed:
#   (use 'git reset HEAD <file>...' to unstage)
#
#    new file:   test.txt
#
# Changes not staged for commit:
#   (use 'git add <file>...' to update what will be committed)
#   (use 'git checkout -- <file>...' to discard changes in working directory)
#
#    modified:   test.txt
#

gittest$ git checkout .

gittest$ git status
# On branch master
# Changes to be committed:
#   (use 'git reset HEAD <file>...' to unstage)
#
#    new file:   test.txt
#

我们已经为登台区域赋予了意义。 我们还可以将其视为我们面临的第一个“环境”, 因为每个没有特定参数的命令都可以在暂存中使用

让我们继续。 现在,我们可以向登台区域添加或放弃更改。 我们还知道如何通过git commit持久存储更改。 我们尚不知道该怎么做的是完全丢弃我们的暂存区。

与我们之前所做的类似通过以下操作执行丢弃阶段

git checkout HEAD .

从技术上讲,这意味着我们将还原到特定的提交点 ,即最后一个提交点 (HEAD)。

在测试之前,我们必须执行几个交互操作,因为不一致的git行为不允许我们立即执行测试。 原因是因为我们的文件是“新”文件,而不是“修改”文件。 这打破了对称性,但让我稍后再讨论这个概念。

@pantinor gittest$ git status
# On branch master
# Changes to be committed:
#   (use 'git reset HEAD <file>...' to unstage)
#
#    new file:   test.txt
#
pantinor@pantinor gittest$ git commit -m 'added new file'
[master f331e52] added new file
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
pantinor@pantinor gittest$ git status
# On branch master
nothing to commit (working directory clean)
pantinor@pantinor gittest$ echo 'added' >> test.txt 
pantinor@pantinor gittest$ git status
# On branch master
# Changes not staged for commit:
#   (use 'git add <file>...' to update what will be committed)
#   (use 'git checkout -- <file>...' to discard changes in working directory)
#
#    modified:   test.txt
#
no changes added to commit (use 'git add' and/or 'git commit -a')
pantinor@pantinor gittest$ git add test.txt
pantinor@pantinor gittest$ git status
# On branch master
# Changes to be committed:
#   (use 'git reset HEAD <file>...' to unstage)
#
#    modified:   test.txt
#
pantinor@pantinor gittest$ git checkout HEAD .
pantinor@pantinor gittest$ git status
# On branch master
nothing to commit (working directory clean)

我们刚刚学习了如何恢复到干净的状态。 现在,我们对暂存区域的恐惧减少了。 但是我们仍然是糟糕的git用户。 在开始修改工作文件夹之前,我们总是忘记分支,如下所示: http : //nvie.com/posts/a-successful-git-branching-model/就我而言,它通常是这样的:我情况稳定,然后我开始进行调整。 但是调整不是线性的,几分钟后,我有很多修改过的文件。 是的,我可以将它们全部暂存并提交,但是我不信任自己,也不想污染master分支。 如果从修改开始就进入dev分支,那就更好了 。 我现在能做什么? 我们可以动态创建一个分支并切换到它。

pantinor@pantinor gittest$ echo something >> test.txt 
pantinor@pantinor gittest$ git status
# On branch master
# Changes not staged for commit:
#   (use 'git add <file>...' to update what will be committed)
#   (use 'git checkout -- <file>...' to discard changes in working directory)
#
#    modified:   test.txt
#
no changes added to commit (use 'git add' and/or 'git commit -a')
pantinor@pantinor gittest$ git checkout -b dev
M    test.txt
Switched to a new branch 'dev'

从我的输出中可以看到,在这个新分支上,我们仍将访问共享的暂存区:

pantinor@pantinor gittest$ git status
# On branch dev
# Changes not staged for commit:
#   (use 'git add <file>...' to update what will be committed)
#   (use 'git checkout -- <file>...' to discard changes in working directory)
#
#    modified:   test.txt
#
no changes added to commit (use 'git add' and/or 'git commit -a')

我们现在要做的是将工作情况添加到暂存中并进行提交,以便能够刷新共享的暂存区。

pantinor@pantinor gittest$ git add .
pantinor@pantinor gittest$ git commit -m unstable
[dev 5d597b2] unstable
 1 file changed, 1 insertion(+)
pantinor@pantinor gittest$ git status
# On branch dev
nothing to commit (working directory clean)

pantinor@pantinor gittest$ cat test.txt 
text
something

然后,当我们返回主节点时,我们可以发现它没有进行任何实验性修改,而对于master分支还不成熟:

pantinor@pantinor gittest$ git checkout master
Switched to branch 'master'
pantinor@pantinor gittest$ git status
# On branch master
nothing to commit (working directory clean)
pantinor@pantinor gittest$ echo test.txt 
test.txt

大。 使我们的命令相对简单并且没有参数和标志,我们能够执行所有不可避免的错误。

现在让我们介绍另一个模式来应对我们的其他典型错误 。 情况与刚才描述的情况相似,但情况稍差一些。 同样, 在开始使用代码之前我们还没有分支,但是这次我们也提交了几次,然后才意识到我们提交的内容不如我们想象的好。 这次我们想要做的是保持不稳定的状况,但是我们希望将其从当前分支中移开( 硬重置 )。 让我们做几个提交:

pantinor@pantinor gittest$ git status
# On branch master
nothing to commit (working directory clean)
pantinor@pantinor gittest$ cat test.txt 
text
pantinor@pantinor gittest$ echo 'modification1' >> test.txt 
pantinor@pantinor gittest$ git commit -a -m'first commit'
[master 9ad2aa8] first commit
 1 file changed, 1 insertion(+)
pantinor@pantinor gittest$ echo 'modification2' >> test.txt 
pantinor@pantinor gittest$ git commit -a -m'second commit'
[master 7005a92] second commit
 1 file changed, 1 insertion(+)
pantinor@pantinor gittest$ cat test.txt 
text
modification1
modification2
pantinor@pantinor gittest$ git log
commit 7005a92a3ceee37255dc7143239d55c7c3467551
Author: Paolo Antinori <pantinor redhat.com='redhat.com'>
Date:   Sun Dec 16 21:05:48 2012 +0000

    second commit

commit 9ad2aa8fae1cbd844f34da2701e80d2c6e39320e
Author: Paolo Antinori <pantinor redhat.com='redhat.com'>
Date:   Sun Dec 16 21:05:23 2012 +0000

    first commit

commit f331e52f41a862d727869b52e2e42787aa4cb57f
Author: Paolo Antinori <pantinor redhat.com='redhat.com'>
Date:   Sun Dec 16 20:20:15 2012 +0000

    added new file

此时,我们想将最后2个提交移到另一个分支:

git branch unstable

我们创建了一个新分支,但尚未切换到该分支。 刚创建的新分支显然具有创建时存在的所有内容,即我们要删除的2个提交。 因此, 我们可以将当前分支恢复为先前的提交,完全丢弃将在不稳定分支上保持可用的最新分支 。 要查看我们要还原的提交内容:

git log

我们需要读取与提交关联的哈希码 ,以便能够执行回滚( 硬重置 ):

pantinor@pantinor gittest$ git reset --hard f331e52f41a862d727869b52e2e42787aa4cb57f
HEAD is now at f331e52 added new file

如果现在执行git status或git log,将看不到任何不稳定提交的痕迹,而可以在不稳定分支中访问它们 。 当前:

pantinor@pantinor gittest$ cat test.txt 
text
pantinor@pantinor gittest$ git log
commit f331e52f41a862d727869b52e2e42787aa4cb57f
Author: Paolo Antinori <pantinor redhat.com='redhat.com'>
Date:   Sun Dec 16 20:20:15 2012 +0000

    added new file

在分支机构:

pantinor@pantinor gittest$ git checkout unstable 
Switched to branch 'unstable'
pantinor@pantinor gittest$ cat test.txt 
text
modification1
modification2
pantinor@pantinor gittest$ git log
commit 7005a92a3ceee37255dc7143239d55c7c3467551
Author: Paolo Antinori <pantinor redhat.com='redhat.com'>
Date:   Sun Dec 16 21:05:48 2012 +0000

    second commit

commit 9ad2aa8fae1cbd844f34da2701e80d2c6e39320e
Author: Paolo Antinori <pantinor redhat.com='redhat.com'>
Date:   Sun Dec 16 21:05:23 2012 +0000

    first commit

commit f331e52f41a862d727869b52e2e42787aa4cb57f
Author: Paolo Antinori <pantinor redhat.com='redhat.com'>
Date:   Sun Dec 16 20:20:15 2012 +0000

    added new file

参考: Git –Someday Never Comes博客上,让我们的JCG合作伙伴 Paolo Antinori 犯错误(并学习如何纠正它们)

翻译自: https://www.javacodegeeks.com/2013/03/git-lets-make-errors-and-learn-how-to-revert-them.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值