创建公开密钥认证所需的 SSH Key,
并将其添加至 GitHub
ssh-keygen -t rsa -C "your_email@example.com"
id_rsa 文件是私有密钥,id_rsa.pub 是公开密钥。
Key 部分请粘贴 id_rsa.pub 文件里的内容。id_rsa.pub
的内容可以用如下方法查看。
$ cat 你的路径/id_rsa.pub
ssh-rsa 你的公有秘钥 xyyhqq@gmail.com
复制这里的全部 ssh到 .com 全部字符 到github的ssh秘钥部分
初始化仓库
git init
查看仓库的状态
git status
向暂存区中添加文件
git add
保存仓库的历史记录
git commit
记述一行提交信息
$ git commit -m "First commit"
记述详细提交信息
刚才我们只简洁地记述了一行提交信息,如果想要记述得更加详
细,请不加 -m,直接执行 git commit命令。执行后编辑器就会启
动,并显示如下结果。
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
#
# Initial commit
查看提交后的状态
git status
查看提交日志
git log
只显示提交信息的第一行
git log --pretty=short
只显示指定目录、文件的日志
git log README.md
显示文件的改动
$ git log -p
比如,执行下面的命令,就可以只查看 README.md 文件的提交日
志以及提交前后的差别。
$ git log -p README.md
查看更改前后的差别
git diff
查看工作树和暂存区的差别
执行 git diff命令,查看当前工作树与暂存区的差别。
$ git diff
diff --git a/README.md b/README.md
index e69de29..cb5dc9f 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1 @@
+# Git教程
查看工作树和最新提交的差别
$ git diff HEAD
diff --git a/README.md b/README.md
index e69de29..cb5dc9f 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1 @@
+# Git教程
显示分支一览表
git branch
创建、切换分支
git checkout - b
切换到 feature - A 分支并进行提交
$ git checkout -b feature-A
Switched to a new branch 'feature-A'
$ git branch feature-A
$ git checkout feature-A
切换到 master 分支
现在我们再来看一看 master 分支有没有受到影响。首先切换至
master 分支。
$ git checkout master
Switched to branch 'master'
切换回上一个分支
现在,我们再切换回 feature-A 分支。
$ git checkout -
Switched to branch 'feature-A'
合并分支
git merge
接下来,我们假设 feature-A 已经实现完毕,想要将它合并到主干分
支 master 中。首先切换到 master 分支。
$ git checkout master
Switched to branch 'master'
然后合并 feature-A 分支。为了在历史记录中明确记录下本次分支合
并,我们需要创建合并提交。因此,在合并时加上 --no-ff参数
git merge --no-ff feature-A
默认信息中已经包含了是从 feature-A 分支合并过来的相关内容,所
以可不必做任何更改。将编辑器中显示的内容保存,关闭编辑器,然后
图灵社区会员 lxghost2 专享 尊重版权
就会看到下面的结果。
Merge made by the 'recursive' strategy.
README.md | 2 ++
1 file changed, 2 insertions(+)
git log -- graph——以图表形式查看分支
git reset——回溯历史版本
回溯到创建 feature - A 分支前
让我们先回溯到上一节 feature-A 分支创建之前,创建一个名为
fix-B 的特性分支。
要让仓库的 HEAD、暂存区、当前工作树回溯到指定状态,需要用
到 git rest --hard命令。只要提供目标时间点的哈希值
完全恢复至该时间点的状态。事不宜迟,让我们执行下面的命令。
$ git reset --hard fd0cbf0d4a25f747230694d95cac1be72d33441d
HEAD is now at fd0cbf0 Add index
创建 fix - B 分支
现在我们来创建特性分支(fix-B)。
$ git checkout -b fix-B
Switched to a new branch 'fix-B'
作为这个主题的作业内容,我们在 README.md 文件中添加一行
文字。
# Git教程
- fix-B
然后直接提交 README.md 文件。
$ git add README.md
$ git commit -m "Fix B"
[fix-B 4096d9e] Fix B
1 file changed, 2 insertions(+)
现在的状态如图 4.5 所示。接下来我们的目标是图 4.6 中所示的状
态,即主干分支合并 feature-A 分支的修改后,又合并了 fix-B 的修改
推进至 feature - A 分支合并后的状态
git log命令只能查看以当前状态为终点的历史日志。所以这里
要使用 git reflog命令,查看当前仓库的操作日志。在日志中找出
回溯历史之前的哈希值,通过 git reset --hard命令恢复到回溯历
史前的状态。
首先执行 git reflog 命令,查看当前仓库执行过的操作的日志。
$ git reflog
4096d9e HEAD@{0}: commit: Fix B
fd0cbf0 HEAD@{1}: checkout: moving from master to fix-B
fd0cbf0 HEAD@{2}: reset: moving to fd0cbf0d4a25f747230694d95cac1be72d33441d
83b0b94 HEAD@{3}: merge feature-A: Merge made by the 'recursive' strategy.
fd0cbf0 HEAD@{4}: checkout: moving from feature-A to master
8a6c8b9 HEAD@{5}: checkout: moving from master to feature-A
fd0cbf0 HEAD@{6}: checkout: moving from feature-A to master
8a6c8b9 HEAD@{7}: commit: Add feature-A
fd0cbf0 HEAD@{8}: checkout: moving from master to feature-A
fd0cbf0 HEAD@{9}: commit: Add index
9f129ba HEAD@{10}: commit (initial): First commit
$ git checkout master
$ git reset --hard 83b0b94
HEAD is now at 83b0b94 Merge branch 'feature-A'
消除冲突
$ git merge --no-ff fix-B
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Recorded preimage for 'README.md'
Automatic merge failed; fix conflicts and then commit the result.
查看冲突部分并将其解决
用编辑器打开 README.md 文件,就会发现其内容变成了下面这个
样子。
Git教程
<<<<<<< HEAD
- feature-A
=======
- fix-B
>>>>>>> fix-B
======= 以上的部分是当前 HEAD 的内容,以下的部分是要合并
的 fix-B 分支中的内容。我们在编辑器中将其改成想要的样子。
# Git教程
- feature-A
- fix-B
如上所示,本次修正让 feature-A 与 fix-B 的内容并存于文件之中。
但是在实际的软件开发中,往往需要删除其中之一,所以各位在处理冲
突时,务必要仔细分析冲突部分的内容后再行修改
提交解决后的结果
冲突解决后,执行 git add命令与 git commit命令
$ git add README.md
$ git commit -m "Fix conflict"
Recorded resolution for 'README.md'.
[master 6a97e48] Fix conflict
git commit -- amend——修改提交信息
git rebase - i——压缩历史
创建 feature - C 分支
首先,新建一个 feature-C 特性分支。
$ git checkout -b feature-C
Switched to a new branch 'feature-C'
提交这部分内容。这个小小的变更就没必要先执行 git add命令再
执行 git commit命令了,
我们用
git commit -am命令
来一次完成这两步操作。
$ git commit -am "Add feature-C"
[feature-C 7a34294] Add feature-C
1 file changed, 1 insertion(+)
修正拼写错误
现在来修正刚才预留的拼写错误。请各位自行修正 README.md 文
件的内容,修正后的差别如下所示。
$ git diff
diff --git a/README.md b/README.md
index ad19aba..af647fd 100644
--- a/README.md
+++ b/README.md
@@ -2,4 +2,4 @@
- feature-A
- fix-B
- - faeture-C
+ - feature-C
然后进行提交。
$ git commit -am "Fix typo"
[feature-C 6fba227] Fix typo
1 file changed, 1 insertion(+), 1 deletion(-)
更改历史
因此,我们来更改历史。将 "Fix typo"修正的内容与之前一次的
提交合并,在历史记录中合并为一次完美的提交。为此,我们要用到
git rebase命令。
$ git rebase -i HEAD~2
合并至 master 分支
在 GitHub 上新建一个仓库。
为防止与其他仓
库混淆,仓库名请与本地仓库保持一致,即 git-tutorial。创建时请不要
勾选 Initialize this repository with a README 选项(图 4.8)。因为一旦勾
选该选项,GitHub 一侧的仓库就会自动生成 README 文件,从创建之
初便与本地仓库失去了整合性。虽然到时也可以强制覆盖,但为防止这
一情况发生还是建议不要勾选该选项,直接点击 Create repository 创建
仓库。
git remote add——添加远程仓库
在 GitHub 上创建的仓库路径为“git@github.com:用户名 /
git-tutorial.git”。现在我们用 git remote add命令将它设置
成本地仓库的远程仓库
A 。
$ git remote add origin git@github.com:github-book/git-tutorial.git
按照上述格式执行 git remote add命令之后,Git 会自动将
git@github.com:github-book/git-tutorial.git远程仓库的
名称设置为 origin(标识符)。
git push——推送至远程仓库
推送至 master 分支
如果想将当前分支下本地仓库中的内容推送给远程仓库,需要用到
git push命令。现在假定我们在 master 分支下进行操作。
$ git push -u origin master
Counting objects: 20, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (20/20), 1.60 KiB, done.
Total 20 (delta 3), reused 0 (delta 0)
To git@github.com:github-book/git-tutorial.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
推送至 master 以外的分支
除了 master 分支之外,远程仓库也可以创建其他分支。举个例子,我
们在本地仓库中创建 feature-D 分支,并将它以同名形式 push 至远程仓库。
$ git checkout -b feature-D
Switched to a new branch 'feature-D'
我们在本地仓库中创建了 feature-D 分支,现在将它 push
给远程仓库并保持分支名称不变。
$ git push -u origin feature-D
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:github-book/git-tutorial.git
* [new branch] feature-D -> feature-D
Branch feature-D set up to track remote branch feature-D from origin.
git clone——获取远程仓库
首先我们换到其他目录下,将 GitHub 上的仓库 clone 到本地。注意
不要与之前操作的仓库在同一目录下。
$ git clone git@github.com:github-book/git-tutorial.git
Cloning into 'git-tutorial'...
remote: Counting objects: 20, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 20 (delta 3), reused 20 (delta 3)
Receiving objects: 100% (20/20), done.
Resolving deltas: 100% (3/3), done.
$ cd git-tutorial
执行 git clone命令后我们会默认处于 master 分支下,同时系统
会自动将 origin 设置成该远程仓库的标识符。也就是说,当前本地仓库
的 master 分支与 GitHub 端远程仓库(origin)的 master 分支在内容上是
完全相同的。
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/feature-D
remotes/origin/master
获取远程的 feature - D 分支
我们试着将 feature-D 分支获取至本地仓库。
$ git checkout -b feature-D origin/feature-D
Branch feature-D set up to track remote branch feature-D from origin.
Switched to a new branch 'feature-D'
向本地的 feature - D 分支提交更改
现在假定我们是另一名开发者,要做一个新的提交。在 README.
md 文件中添加一行文字,查看更改。
$ git diff
diff --git a/README.md b/README.md
index af647fd..30378c9 100644
--- a/README.md
+++ b/README.md
@@ -3,3 +3,4 @@
- feature-A
- fix-B
- feature-C
+ - feature-D
向本地的 feature - D 分支提交更改
现在假定我们是另一名开发者,要做一个新的提交。在 README.
md 文件中添加一行文字,查看更改。
$ git diff
diff --git a/README.md b/README.md
index af647fd..30378c9 100644
--- a/README.md
+++ b/README.md
@@ -3,3 +3,4 @@
- feature-A
- fix-B
- feature-C
+ - feature-D
按照之前学过的方式提交即可。
$ git commit -am "Add feature-D"
[feature-D ed9721e] Add feature-D
1 file changed, 1 insertion(+)
推送 feature - D 分支
现在来推送 feature-D 分支。
$ git push
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 281 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@github.com:github-book/git-tutorial.git
ca0f98b..ed9721e feature-D -> feature-D
git pull——获取最新的远程仓库分支
现在我们放下刚刚操作的目录,回到原先的那个目录下。这边的本
地仓库中只创建了 feature-D 分支,并没有在 feature-D 分支中进行任何
图灵社区会员 lxghost2 专享 尊重版权
68 第 4 章 通过实际操作学习 Git
提交。然而远程仓库的 feature-D 分支中已经有了我们刚刚推送的提交。
这时我们就可以使用 git pull 命令,将本地的 feature-D 分支更新到最新
状态。当前分支为 feature-D 分支。
$ git pull origin feature-D
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 1), reused 3 (delta 1)
Unpacking objects: 100% (3/3), done.
From github.com:github-book/git-tutorial
* branch feature-D -> FETCH_HEAD
First, rewinding head to replay your work on top of it...
Fast-forwarded feature-D to ed9721e686f8c588e55ec6b8071b669f411486b8.