1. git clone——获取远程仓库
当 git fetch 命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。它只会获取数据然后 让你自己合并。
然而,有一个命令叫作 git pull 在大多数情况下它的含义是一个 git fetch 紧接着一个 git merge 命令。如果有一个像之前章节中演示的设置好的跟踪分支,不管它是显式地设置还是通过 clone 或 checkout 命令为你创建的,git pull 都会查找当前分支所跟踪的服务器与分支,从服务器上抓取数据然后尝试合并入那个远程分支。
- 获取远程仓库
$ 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
我们用 git branch -a 命令查看当前分支的相关信息。添加 -a 参数可以同时显示本地仓库和远程仓库的分支信息。
- 获取远程的 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'
-b 参数的后面是本地仓库中新建分支的名称。为了便于理解,我们仍将其命名为 feature-D,让它与远程仓库的对应分支保持同名。新建分支名称后面是获取来源的分支名称。例子中指定了origin/feature-D,就是说以名为 origin 的仓库(这里指GitHub 端的仓库)的 feature-D 分支为来源,在本地仓库中创建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 分支
$ 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
从远程仓库获取 feature-D 分支,在本地仓库中提交更改,再将 feature-D 分支推送回远程仓库,通过这一系列操作,就可以与其他开发者相互合作,共同培育 feature-D 分支,实现某些功能。
2. git pull——获取最新的远程仓库分支
这边的本地仓库中只创建了 feature-D 分支,并没有在 feature-D 分支中进行任何提交。然而远程仓库的 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.
GitHub 端远程仓库中的 feature-D 分支是最新状态,所以本地仓库中的 feature-D 分支就得到了更新。今后只需要像平常一样在本地进行提交再 push 给远程仓库,就可以与其他开发者同时在同一个分支中进行作业,不断给 feature-D 增加新功能。
Git 保存密码
https://blog.csdn.net/youanyyou/article/details/78992990
3. Git 基本操作
3.5 提交已修改文件 (git commit)
git commit 命令可以将当前暂存区中的文件实际保存到仓库的历史记录中。
-
记述一行提交信息
$ git commit -m "First commit" [master (root-commit) 9f129ba] First commit 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README.md
-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 # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: README.md #
在编辑器中记述提交信息的格式如下:
- 第一行:用一行文字简述提交的更改内容
- 第二行:空行
- 第三行以后:记述更改的原因和详细内容
只要按照上面的格式输入,今后便可以通过确认日志的命令或工具看到这些记录。在以#(井号)标为注释的Changes to be committed(要提交的更改)栏中,可以查看本次提交中包含的文件。将提交信息按格式记述完毕后,请保存并关闭编辑器,以 #(井号)标为注释的行不必删除。随后,刚才记述的提交信息就会被提交。
-
终止提交
如果在编辑器启动后想中止提交,请将提交信息留空并直接关闭编辑器,随后提交就会被中止。
-
查看提交后的状态
执行完git commit命令后再来查看当前状态。
$ git status # On branch master nothing to commit, working directory clean
当前工作树处于刚刚完成提交的最新状态,所以结果显示没有更改。
3.6 跳过暂存区直接提交
Git 提供了一个跳过使用暂存区域的方式,只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤:
3.7 忽略文件
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。在这种情况下,我们可以创建一个名为 .gitignore
的文件,列出要忽略的文件模式。来看一个实际的例子:
$ cat .gitignore
*.[oa]
*~
第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的。第二行告诉 Git 忽略所有以波浪符(~)结尾的文件,此外,你可能还需要忽略 log,tmp 或者 pid 目录,以及自动生成的文档等等。
文件 .gitignore 的格式规范如下:
• 所有空行或者以 # 开头的行都会被 Git 忽略。
• 可以使用标准的 glob 模式匹配。
• 匹配模式可以以(/)开头防止递归。
• 匹配模式可以以(/)结尾指定目录。
• 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。
星号(*)匹配零个或多个任意字符;
[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);
问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如[0-9] 表示匹配所有 0 到 9 的数字)。
使用两个星号(**) 表示匹配任意中间目录,比如a/**/z
可以匹配 a/z,
a/b/z 或 a/b/c/z
等。
3.8 查看提交日志(git log)
$ git log
commit 9f129bae19b2c82fb4e98cde5890e52a6c546922
Author: hirocaster <hohtsuka@gmail.com>
Date: Sun May 5 16:06:49 2013 +0900
First commit
默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面。正如你所看到的,这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
git log 有许多选项可以帮助你搜寻你所要找的提交,接下来我们介绍些最常用的。
-
只显示提交信息的第一行
如果只想让程序显示第一行简述信息,可以在git log命令后加上–pretty=short,有另外还
有 short,full 和 fuller 参数可以使用。$ git log --pretty=short commit 9f129bae19b2c82fb4e98cde5890e52a6c546922 Author: hirocaster <hohtsuka@gmail.com> First commit
-
只显示指定目录、文件的日志
只要在git log命令后加上目录名,便会只显示该目录下的日志。如果加的是文件名,就会只显示与该文件相关的日志。
$ git log README.md
-
显示每次提交的内容差异
如果想查看提交所带来的改动,可以加上 -p 参数,文件的前后差别就会显示在提交信息之后。也可以加上 -2 来仅显示最近两次提交
$ git log -p -2 README.md
-
git log --graph——以图表形式查看分支
用git log --graph命令进行查看的话,能很清楚地看到特性分支(feature-A)提交的内容已被合并。除此以外,特性分支的创建以
及合并也都清楚明了。$ git log --graph * commit 83b0b94268675cb715ac6c8a5bc1965938c15f62 |\ Merge: fd0cbf0 8a6c8b9 | | Author: hirocaster <hohtsuka@gmail.com> | | Date: Sun May 5 16:37:57 2013 +0900 | | | | Merge branch 'feature-A' | | | * commit 8a6c8b97c8962cd44afb69c65f26d6e1a6c088d8 |/ Author: hirocaster <hohtsuka@gmail.com> | Date: Sun May 5 16:22:02 2013 +0900 | | Add feature-A | * commit fd0cbf0d4a25f747230694d95cac1be72d33441d | Author: hirocaster <hohtsuka@gmail.com> | Date: Sun May 5 16:10:15 2013 +0900 | | Add index | * commit 9f129bae19b2c82fb4e98cde5890e52a6c546922 Author: hirocaster <hohtsuka@gmail.com> Date: Sun May 5 16:06:49 2013 +0900 First commit
3.9 查看已暂存和未暂存的修改差异(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 add命令向暂存区添加任何东西,所以程序只会显示工作树与最新提交状态之间的差别。 “+”号标出的是新添加的行,被删除的行则用“-”号标出。我们可以看到,这次只添加了一行。
-
查看工作树和最新提交的差别
要查看与最新提交的差别,请执行以下命令
$ 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 commit命令之前先执行 git diff HEAD命令,查看本次提交与上次提交之间有什么差别,等确认完毕后再进行提交。这里的 HEAD 是指向当前分支中最新一次提交的指针。