Git 命令

昨天我们说一下关于 git 的一些命令,今天说下它的一些高级操作。

1.检查提交之间的差异

每个提交都以数字和符号的字符串形式存在唯一的 ID。
要查看所有提交及其 ID 的列表,我们可以使用 git log:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ git log
commit ba25c0ff30e1b2f0259157b42b9f8f5d174d80d7
Author: Tutorialzine
Date: Mon May 30 17:15:28 2016 +0300

New feature complete

commit b10cc1238e355c02a044ef9f9860811ff605c9b4
Author: Tutorialzine
Date: Mon May 30 16:30:04 2016 +0300

Added content to hello.txt

commit 09bd8cc171d7084e78e4d118a2346b7487dca059
Author: Tutorialzine
Date: Sat May 28 17:52:14 2016 +0300

Initial commit

正如你所看到的,ID 是很长的,但是和它们一起工作时,没有必要复制整个东西 - 前几个符号通常就足够了。
要查看提交中的新增内容,我们可以运行 git show [commit]:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git show b10cc123

commit b10cc1238e355c02a044ef9f9860811ff605c9b4
Author: Tutorialzine
Date: Mon May 30 16:30:04 2016 +0300

Added content to hello.txt

diff --git a/hello.txt b/hello.txt
index e69de29..b546a21 100644
--- a/hello.txt
+++ b/hello.txt
@@ -0,0 +1 @@
+Nice weather today,isn't it?

要查看任何两个提交之间的区别,我们可以使用 git diff[commit-from] .. [commit-to]语法:

1
2
3
4
5
6
7
8
9
10
11
$ git diff 09bd8cc..ba25c0ff

diff --git a/feature.txt b/feature.txt
new file mode 100644
index 0000000..e69de29
diff --git a/hello.txt b/hello.txt
index e69de29..b546a21 100644
--- a/hello.txt
+++ b/hello.txt
@@ -0,0 +1 @@
+Nice weather today, isn't it?

我们已经比较了第一次提交和最后一次提交,所以我们看到了所有的改变。
通常使用这个 git difftool 命令可以更容易地完成这个任务,这个命令可以让一个图形化的客户端显示所有的差异。

2.将文件恢复到以前的版本

Git 允许我们将任何选定的文件返回到某个提交中的方式。这是通过 git checkout
我们以前用来切换分支的熟悉的命令完成的,但是也可以用来在提交之间切换(在 Git 中一个命令用于多个看起来不相关的任务是很常见的)。
在下面的例子中,我们将采用 hello.txt,并将自从初始提交以来所做的一切都撤销。
要做到这一点,我们必须提供我们想要返回的提交的 id,以及我们文件的完整路径。

  • $ git checkout 09bd8cc1 hello.txt

3.修复提交

如果你注意到你在提交信息中输入了一个错字,或者你忘记了添加一个文件,并且在提交之后你看到了,你可以很容易地解决这个问题 git commit –amend。这将添加从上次提交到暂存区域的所有内容,并尝试进行新的提交。这给你一个机会来解决你的提交信息或添加更多的文件到临时区域。

对于不在上次提交中的更复杂的修复(或者如果您已经推送了更改),则必须使用 git revert。 这将采取提交引入的所有更改,将其回滚,并创建一个与此相反的新提交。

最新的提交可以被 HEAD 别名访问。

  • $ git revert HEAD

对于其他提交,最好使用一个 id。

  • $ git revert b10cc123

当恢复较旧的提交时,请记住合并冲突很可能会出现。
当一个文件被另一个更近的提交改变时,会发生这种情况,现在 Git 找不到正确的行来恢复,因为它们不在那里了。

4.解决合并后的冲突

除了前面所描述的情况之外,在合并分支或者牵扯其他人的工作时经常出现冲突。
有时候,冲突是由 git 自动处理的,但有时候处理这些冲突的人必须决定(通常是精选)哪些代码保留,什么被删除。

我们来看一个例子,我会合并两个叫做 john_branch 和 tim_branch 的分支。
小张和小李都在同一个文件中写入一个显示数组中所有元素的函数。
小张正在使用 for 循环:

1
2
3
4
//使用for循环到console.log内容。
for (vari = 0; i < arr.length; i++) {
console.log(arr[i]);
}

小李喜欢 forEach:

1
2
3
4
//使用forEach到console.log内容。
arr.forEach(function (item) {
console.log(item);
});

他们都在各自的分支上提交代码。
现在,如果他们尝试合并两个分支,他们将看到以下错误消息:

1
2
3
4
5
$ git merge tim_branch

Auto-merging print_array.js
CONFLICT (content): Merge conflict in print_array.js
Automatic merge failed; fix conflicts and then commit the result.

Git 无法自动合并分支,所以现在由开发人员手动解决冲突。
如果他们打开冲突所在的文件,他们会看到 Git 在冲突的行上插入了一个标记。

1
2
3
4
5
6
7
8
9
10
11
12
<<<<<<< HEAD
// Use a for loop to console.log contents.
for (vari=0; i<arr.length; i++) {
console.log(arr[i]);
}
=======
// Use forEach to console.log contents.
arr.forEach(function(item){
console.log(item);
})

>>>>>>> xiaozhang's commit.

在=====之上,我们有当前的 HEAD 提交,并且在冲突之下。
这样我们就可以清楚地看到差异,并决定哪个版本更好,或者一起写一个新版本。
在这种情况下,我们去找后者,重写整个事情,删除标记让 Git 知道我们已经完成了。

1
2
3
//不使用循环或forEach。
//将Array.toString()用于console.log内容。
console.log(arr.toString());

当所有东西都被设置好后,就必须完成一个合并提交来完成这个过程。

  • $ git add -A
  • $ git commit -m “解决冲突.”

正如你所看到的,这个过程非常烦人,在大型项目中可能会遇到很大的困难。
大多数开发人员倾向于在 GUI 客户端(下载https://git-scm.com/download/gui/linux)
的帮助下解决冲突,这使事情变得更容易。运行图形客户端使用 git mergetool。

5.设置.gitignore

在大多数项目中都有我们不想提交的文件或整个文件夹。
我们可以 git add -A 通过创建.gitignore 文件来确保它们不会被意外地包含在我们
的内容中:

  1. 手动创建一个名为.gitignore 的文本文件,并将其保存到项目目录中。
  2. 在里面,列出要忽略的文件/目录的名称,每个都在一个新的行上。
  3. .gitignore 本身必须被添加,提交和推送,就像项目中的任何其他文件一样。很好的文件被忽略的例子是:
  • 日志文件
  • 任务运行者建立
  • node.js 项目中的 node_modules 文件夹
  • 由 NetBeans 和 IntelliJ 等 IDE 创建的文件夹
  • 个人开发者笔记

禁止上述所有内容的.gitignore 将如下所示:

1
2
3
4
5
*.log
build/
node_modules/
.idea/
my_notes.txt

在某些行末尾的斜线表示这是一个文件夹,我们忽略了递归中的所有内容。星号通常用作通配符。

Git 相当复杂,并提供更多的功能和技巧。如果你想了解更多
推荐的学习资源:

  • 官方的 Git 文档,包括一整本书和视频课程 -在这里(https://git-scm.com/doc)。
  • 让 git 正确 - Atlassian 收集的教程和文章 -在这里(https://www.atlassian.com/git/)。
  • 一个 GUI 客户端列表 -在这里(https://www.git-scm.com/downloads/guis)。
  • Git 备忘单(PDF) -这里。
  • https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf
  • 生成.gitignore 文件的在线工具 -在这里。 https://www.gitignore.io/