Open sakila1012 opened 6 years ago
最近,我们发布了一些教程促使你了解 Git 基础知识和在团队环境中使用 Git。谈论的指令已经足够帮助一个开发者在 Git 世界中生存。在这次教程中,我们尝试如何在有效的时间内充分掌握提供的 Git 特性。
说明:文中一些指令包含指令的部分在方括号中(如:git add -p [file_name])。在这些案例中,你可以不用方括号,选择插入一些必要的数字,标识符等等,
将下列脚本运行在 Unix 系统中。
cd ~ curl https://raw.github.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash 接下来,在你的 ~/.bash_profile 文件中添加下面几行:
if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi 尽管之前提到过,我仍然不能强调其重要性:如果你想充分运用 Git 的特性,你应该明确地转变对命令行的交互!
.pyc .exe my_db_config/
!main.pyc 谁打乱了我的代码? 当某些事出现问题时,责备其他人是人类的本性。如果你的产品服务器坏掉了,很容易查明真凶 —— 只需执行下 git blame指令。这个命令会显示每一个文件中每一行代码的作者,提交会看到当前行的最后一次变化,同时也提交时间戳。
git blame [file_name] git blame demonstration
git blame [file_name]
在屏幕截图下,你会看到这个命令就像一个巨大的源:
git blame on the ATutor repository
-- online -- 将每次提交展示的信息压缩至精简的提交哈希和提交信息中,所有的展示在一行中。
-- graph -- 这个选项绘制了一个在输出左侧基于文本的图形展示的历史信息。如果你想看到每个分支的历史信息是无用的。
-- all -- 展示所有分支的历史信息。
下面是这些选项的组合:
Use of git log with all, graph and oneline
一个简单的 git log 命令可以显示最新的提交,上一次的提交,上上次的提交等等。然而,git reflog是一个被指向提交的列表。记住:这是你系统的局部,不是源的部分,不包含推送的和合并的。
如果执行 git log,我获取的提交信息是源的一部分。
Project history
然而,当你执行硬重置时,git reflog 展示了提交信息(b1b0ee9–HEAD@{4})是丢失的。
Git reflog
让我们看看你做的几个改变至单个文件中,并想让他们出现在分离的提交中。在这种情况下,我们可以通过添加前缀 -p 来添加文件。
git add -p [file_name] 让我们来证明一致性。我已经添加了三个新行至 file_name,而且我仅想第一和第三行出现在提交信息中。让我们看看 git diff 展示给我们的信息。
git add -p [file_name]
Changes in repo
让我们看看当我们添加一个前缀 -p 至 add 命令上发生了什么。
Running add with -p
似乎 Git 假设所有的改变都是同样的,因此,将它们分成一个大块。你有下列选择:
输入 y 分成块
输入 n 不分块
输入 e 手动编辑块
输入 d 退出或者进入下一个文件
输入 s 分离块
在我们的案例中,我们当然想将它分离成小块,可以有选择地添加一部分并忽略其余的。
Adding all hunks
正如你所看到的,我们已经添加第一行和第三行的信息并忽略了第二行的信息。你可以查看源的状态并提交。
Repository after selectively adding a file
git rebase -i HEAD~[number_of_commits] 如果你想压缩上面两次的提交,你要执行的指令在下面。
git rebase -i HEAD~[number_of_commits]
git rebase -i HEAD~2 在运行这条指令时,会带你来到一个交互的界面中,列出提交的信息,并要求你压缩哪一个。理想地,你会选择最新的提交并压缩上一次的。
git rebase -i HEAD~2
Git squash interactive
要求你为新提交的准备提交信息。这个处理基本上会覆盖你的提交历史。
Adding a commit message
git stash 为了核对保存的列表,你需要执行下面的命令:
git stash
git stash list Stash list
git stash list
如果你想不保存和恢复未提交的变化,你可以应用下面的保存:
git stash apply 在最后一个截图中,你可以看到每次保存都有个标识符,一个唯一的数字(尽管我们仅仅在这种情况下保存)。如果你想只选择有选择性的保存,你可以添加特殊的标识符到 apply 命令中。
git stash apply
git stash apply stash@{2} After un-stashing changes
git stash apply stash@{2}
git fsck --lost-found Git fsck results
git fsck --lost-found
在这里,你可以看到丢失的提交信息。那你可以通过运行 git show [commit_hash] 来核对改变的提交信息,或者通过执行 git merge [commit_hash] 来回复它。
git fsck 相比 reflog 有一种优势。让我们看看你删除了一个远程的分支,然后克隆源。使用 fsck,你可以查询和恢复删除的远程分支。
用最简单的术语来说,cherry-pick 是从不同的分支中选择单个提交和将它和当前分支的合并。如果你在两个或更多的分支中工作,你可能会注意到 bug 会出现所有的分支。如果你在其中一个分支解决了这个 bug,你可以使用 cherry pick 提交至其他分支,不干扰其他文件或提交。
让我们想想可以运用的场景。我有两个分支,并且我想 cherry-pick 提交 b20fd14:清理垃圾:至另外一个分支。
Before cherry pick
切换分支至我想 cherry-pick 的提交,并执行以下指令:
git cherry-pick [commit_hash] After cherry pick
git cherry-pick [commit_hash]
尽管我们已经清除了 cherry-pick 的时间,但是你应该知道这个命令可能经常导致冲突,因此要慎用。
结论 以上,总结下小技巧清单,我认为可以帮你的 Git 技能达到一个新的台阶。Git 是最好的,可以实现任何你想象的。因此,要总是尝试挑战自己使用 Git。你很有可能会学到一些新的东西!
Shaumik Daityari
会见作者
Shaumik Daityari.
Shaumik 是一个乐观主义者,但是一直都是一个人。他是印度 Roorkee 理工学院的一名本科生,也是博客的创始人之一,他喜欢写作,当他不忙时,总是保持写作的习惯。
最近,我们发布了一些教程促使你了解 Git 基础知识和在团队环境中使用 Git。谈论的指令已经足够帮助一个开发者在 Git 世界中生存。在这次教程中,我们尝试如何在有效的时间内充分掌握提供的 Git 特性。
说明:文中一些指令包含指令的部分在方括号中(如:git add -p [file_name])。在这些案例中,你可以不用方括号,选择插入一些必要的数字,标识符等等,
将下列脚本运行在 Unix 系统中。
cd ~ curl https://raw.github.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash 接下来,在你的 ~/.bash_profile 文件中添加下面几行:
if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi 尽管之前提到过,我仍然不能强调其重要性:如果你想充分运用 Git 的特性,你应该明确地转变对命令行的交互!
.pyc .exe my_db_config/
!main.pyc 谁打乱了我的代码? 当某些事出现问题时,责备其他人是人类的本性。如果你的产品服务器坏掉了,很容易查明真凶 —— 只需执行下 git blame指令。这个命令会显示每一个文件中每一行代码的作者,提交会看到当前行的最后一次变化,同时也提交时间戳。
git blame [file_name]
git blame demonstration在屏幕截图下,你会看到这个命令就像一个巨大的源:
git blame on the ATutor repository
-- online -- 将每次提交展示的信息压缩至精简的提交哈希和提交信息中,所有的展示在一行中。
-- graph -- 这个选项绘制了一个在输出左侧基于文本的图形展示的历史信息。如果你想看到每个分支的历史信息是无用的。
-- all -- 展示所有分支的历史信息。
下面是这些选项的组合:
Use of git log with all, graph and oneline
一个简单的 git log 命令可以显示最新的提交,上一次的提交,上上次的提交等等。然而,git reflog是一个被指向提交的列表。记住:这是你系统的局部,不是源的部分,不包含推送的和合并的。
如果执行 git log,我获取的提交信息是源的一部分。
Project history
然而,当你执行硬重置时,git reflog 展示了提交信息(b1b0ee9–HEAD@{4})是丢失的。
Git reflog
让我们看看你做的几个改变至单个文件中,并想让他们出现在分离的提交中。在这种情况下,我们可以通过添加前缀 -p 来添加文件。
git add -p [file_name]
让我们来证明一致性。我已经添加了三个新行至 file_name,而且我仅想第一和第三行出现在提交信息中。让我们看看 git diff 展示给我们的信息。Changes in repo
让我们看看当我们添加一个前缀 -p 至 add 命令上发生了什么。
Running add with -p
似乎 Git 假设所有的改变都是同样的,因此,将它们分成一个大块。你有下列选择:
输入 y 分成块
输入 n 不分块
输入 e 手动编辑块
输入 d 退出或者进入下一个文件
输入 s 分离块
在我们的案例中,我们当然想将它分离成小块,可以有选择地添加一部分并忽略其余的。
Adding all hunks
正如你所看到的,我们已经添加第一行和第三行的信息并忽略了第二行的信息。你可以查看源的状态并提交。
Repository after selectively adding a file
git rebase -i HEAD~[number_of_commits]
如果你想压缩上面两次的提交,你要执行的指令在下面。git rebase -i HEAD~2
在运行这条指令时,会带你来到一个交互的界面中,列出提交的信息,并要求你压缩哪一个。理想地,你会选择最新的提交并压缩上一次的。Git squash interactive
要求你为新提交的准备提交信息。这个处理基本上会覆盖你的提交历史。
Adding a commit message
git stash
为了核对保存的列表,你需要执行下面的命令:git stash list
Stash list如果你想不保存和恢复未提交的变化,你可以应用下面的保存:
git stash apply
在最后一个截图中,你可以看到每次保存都有个标识符,一个唯一的数字(尽管我们仅仅在这种情况下保存)。如果你想只选择有选择性的保存,你可以添加特殊的标识符到 apply 命令中。git stash apply stash@{2}
After un-stashing changesgit fsck --lost-found
Git fsck results在这里,你可以看到丢失的提交信息。那你可以通过运行 git show [commit_hash] 来核对改变的提交信息,或者通过执行 git merge [commit_hash] 来回复它。
git fsck 相比 reflog 有一种优势。让我们看看你删除了一个远程的分支,然后克隆源。使用 fsck,你可以查询和恢复删除的远程分支。
用最简单的术语来说,cherry-pick 是从不同的分支中选择单个提交和将它和当前分支的合并。如果你在两个或更多的分支中工作,你可能会注意到 bug 会出现所有的分支。如果你在其中一个分支解决了这个 bug,你可以使用 cherry pick 提交至其他分支,不干扰其他文件或提交。
让我们想想可以运用的场景。我有两个分支,并且我想 cherry-pick 提交 b20fd14:清理垃圾:至另外一个分支。
Before cherry pick
切换分支至我想 cherry-pick 的提交,并执行以下指令:
git cherry-pick [commit_hash]
After cherry pick尽管我们已经清除了 cherry-pick 的时间,但是你应该知道这个命令可能经常导致冲突,因此要慎用。
结论 以上,总结下小技巧清单,我认为可以帮你的 Git 技能达到一个新的台阶。Git 是最好的,可以实现任何你想象的。因此,要总是尝试挑战自己使用 Git。你很有可能会学到一些新的东西!
Shaumik Daityari
会见作者
Shaumik Daityari.
Shaumik 是一个乐观主义者,但是一直都是一个人。他是印度 Roorkee 理工学院的一名本科生,也是博客的创始人之一,他喜欢写作,当他不忙时,总是保持写作的习惯。