Git基础
获取 Git 仓库
在现有目录中初始化仓库
如果你打算使用 Git 来对现有的项目进行管理,你只需要进入该项目目录并输入:
[root@localhost ssm]# git init
该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是
Git 仓库的骨干。 但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。
如果你是在一个已经存在文件的文件夹(而不是空文件夹)中初始化 Git 仓库来进行版本控制的话,你应该开始
跟踪这些文件并提交。 你可通过 git add 命令来实现对指定文件的跟踪,然后执行 git commit 提交:
[root@localhost ssm]# git add *.c
[root@localhost ssm]# git commit -m 'initial project version'
稍后我们再逐一解释每一条指令的意思。 现在,你已经得到了一个实际维护(或者说是跟踪)着若干个文件的
Git 仓库。
克隆现有的仓库
克隆仓库的命令格式是 git clone [url] 。 比如,要克隆 Git 的可链接库 libgit2,可以用下面的命令:
[root@localhost ssm]# git clone https://github.com/libgit2/libgit2
如果你想在克隆远程仓库的时候,自定义本地仓库的名字,你可以使用如下命令:
[root@localhost ssm]# git clone https://github.com/libgit2/libgit2 mylibgit
这将执行与上一个命令相同的操作,不过在本地创建的仓库名字变为 mylibgit。
记录每次更新到仓库
检查当前文件状态
文件的状态变化周期:
![文件的状态变化周期]
- Untracked files:没有被跟踪的文件(Untracked)
- Changes to be committed :已暂存状态 (Staged)
- Changes not staged for commit :已跟踪文件的内容发生了变化,但还没有放到暂存区 (Modified)
要查看哪些文件处于什么状态,可以用 git status 命令。 如果在克隆仓库后立即使用此命令,会看到类似这
样的输出:
[root@localhost ssm]# git status
On branch master
nothing to commit, working directory clean
这说明你现在的工作目录相当干净。换句话说,所有已跟踪文件在上次提交后都未被更改过(Unmodified)。
现在,让我们在项目下创建一个新的 README 文件。 如果之前并不存在这个文件,使用 git status 命令,你
将看到一个新的未跟踪文件:
[root@localhost ssm]# echo 'My Project' > README
[root@localhost ssm]# git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to
track)
在状态报告中可以看到新建的 README 文件出现在 Untracked files 下面 。未跟踪的文件意味着 Git 在之前
的快照(提交)中没有这些文件;Git 不会自动将之纳入跟踪范围,除非你明明白白地告诉它“我需要跟踪该文
件”, 这样的处理让你不必担心将生成的二进制文件或其它不想被跟踪的文件包含进来。 不过现在的例子中,
我们确实想要跟踪管理 README 这个文件。
跟踪新文件
使用命令 git add 开始跟踪一个文件。 所以,要跟踪 README 文件,运行:
[root@localhost ssm]# git add README
此时再运行 git status 命令,会看到 README 文件已被跟踪,并处于暂存状态:
[root@localhost ssm]# git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file:
只要在 Changes to be committed 这行下面的,就说明是已暂存状态。 如果此时提交,那么该文件此时此
刻的版本将被留存在历史记录中。 你可能会想起之前我们使用 git init 后就运行了 git add (files) 命
令,开始跟踪当前目录下的文件。 git add 命令使用文件或目录的路径作为参数;如果参数是目录的路径,该
命令将递归地跟踪该目录下的所有文件。
暂存已修改文件
现在我们来修改一个已被跟踪的文件。 如果你修改了一个名为 CONTRIBUTING.md 的已被跟踪的文件,然后运
行 git status 命令,会看到下面内容:
[root@localhost ssm]# git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
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: CONTRIBUTING.md
文件 CONTRIBUTING.md 出现在 Changes not staged for commit 这行下面,说明已跟踪文件的内容发
生了变化,但还没有放到暂存区。 要暂存这次更新,需要运行 git add 命令。 这是个多功能命令:可以用它开
始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这
个命令理解为“添加内容到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。 现在让我们运行
git add 将"CONTRIBUTING.md"放到暂存区,然后再看看 git status 的输出:
[root@localhost ssm]# git add CONTRIBUTING.md
[root@localhost ssm]# git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
现在两个文件都已暂存,下次提交时就会一并记录到仓库。 假设此时,你想要在 CONTRIBUTING.md 里再加条
注释, 重新编辑存盘后,准备好提交。 不过且慢,再运行 git status 看看:
[root@localhost ssm]# vim CONTRIBUTING.md
[root@localhost ssm]# git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
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: CONTRIBUTING.md
怎么回事? 现在 CONTRIBUTING.md 文件同时出现在暂存区和非暂存区。 这怎么可能呢? 好吧,实际上 Git 只
不过暂存了你运行 git add 命令时的版本, 如果你现在提交,CONTRIBUTING.md 的版本是你最后一次运行
git add 命令时的那个版本,而不是你运行 git commit 时,在工作目录中的当前版本。 所以,运行了 git
add 之后又作了修订的文件,需要重新运行 git add 把最新版本重新暂存起来:
[root@localhost ssm]# git add CONTRIBUTING.md
[root@localhost ssm]# git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
状态简览
git status 命令的输出十分详细,但其用语有些繁琐。 如果你使用 git status -s 命令或 git status
--short 命令,你将得到一种更为紧凑的格式输出。 运行 git status -s ,状态报告输出如下:
[root@localhost ssm]# git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。 你
可能注意到了 M 有两个可以出现的位置,出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左
边的 M 表示该文件被修改了并放入了暂存区。 例如,上面的状态报告显示: README 文件在工作区被修改了但
是还没有将修改后的文件放入暂存区,lib/simplegit.rb 文件被修改了并将修改后的文件放入了暂存区。 而
Rakefile 在工作区被修改并提交到暂存区后又在工作区中被修改了,所以在暂存区和工作区都有该文件被修改
了的记录。
忽略文件
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文
件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以创建一个名为 .gitignore
的文件,列出要忽略的文件模式。 来看一个实际的例子:
[root@localhost ssm]# cat .gitignore
*.[oa]
*~
第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的。 第二
行告诉 Git 忽略所有以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副
本。 此外,你可能还需要忽略 log,tmp 或者 pid 目录,以及自动生成的文档等等。 要养成一开始就设置好
.gitignore 文件的习惯,以免将来误提交这类无用的文件。
文件 .gitignore 的格式规范如下:
• 所有空行或者以 # 开头的行都会被 Git 忽略。
• 可以使用标准的 glob 模式匹配。
• 匹配模式可以以(/)开头防止递归。
• 匹配模式可以以(/)结尾指定目录。
• 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号()匹配零个或多个任意字符;[abc] 匹配
任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配
(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号() 表示匹配任意中间目录,比如 a/**/z 可以匹
配 a/z , a/b/z 或 a/b/c/z 等。
我们再看一个 .gitignore 文件的例子:
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf
查看已暂存和未暂存的修改
如果 git status 命令的输出对于你来说过于模糊,你想知道具体修改了什么地方,可以用 git diff 命令。
[root@localhost ssm]# git diff
diff --git a/a.txt b/a.txt
index e69de29..ce01362 100644
--- a/a.txt
+++ b/a.txt
@@ -0,0 +1 @@
+hello
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异, 也就是修改之后还没有暂存起来的变化内
容。
若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --cached 命令。
[root@localhost ssm]# git diff --staged
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..59b3b33
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+*.java
+!a.java
+/temp
diff --git a/README b/README
new file mode 100644
index 0000000..072be97
--- /dev/null
+++ b/README
@@ -0,0 +1,2 @@
+My Project
+My Project
diff --git a/a.txt b/a.txt
new file mode 100644
提交更新
现在的暂存区域已经准备妥当可以提交了。 在此之前,请一定要确认还有什么修改过的或新建的文件还没有
git add 过,否则提交的时候不会记录这些还没暂存起来的变化。 这些修改过的文件只保留在本地磁盘。 所
以,每次准备提交前,先用 git status 看下,是不是都已暂存起来了, 然后再运行提交命令 git commit:
[root@localhost ssm]# git commit -m "story 182"
[master (root-commit) 6cc1b3d] story 182
4 files changed, 7 insertions(+)
create mode 100644 .gitignore
create mode 100644 README
create mode 100644 a.txt
create mode 100644 php/php.txt
好,现在你已经创建了第一个提交! 可以看到,提交后它会告诉你,当前是在哪个分支(master)提交的,本
次提交的完整 SHA-1 校验和是什么(6cc1b3d),以及在本次提交中,有多少文件修订过,多少行添加和删改
过。
请记住,提交时记录的是放在暂存区域的快照。 任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入
版本管理。 每一次运行提交操作,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。
跳过使用暂存区域
尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。 Git 提供了一个跳过使用暂
存区域的方式, 只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存
起来一并提交,从而跳过 git add 步骤
移除文件
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。
可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清
单中了。
移动文件
要在 Git 中对文件改名,可以这么做:
$ git mv file_from file_to
其实,运行 git mv 就相当于运行了下面三条命令:
$ mv file_from file_to
$ git rm file_from
$ git add file_to
如此分开操作,Git 也会意识到这是一次改名,所以不管何种方式结果都一样。 两者唯一的区别是,mv 是一条
命令而另一种方式需要三条命令,直接用 git mv 轻便得多。 不过有时候用其他工具批处理改名的话,要记得
在提交前删除老的文件名,再添加新的文件名。
查看提交历史
在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的
工具是 git log 命令。 下面是我自己写了一个个人博客的提交记录:
先克隆现有仓库:
git clone https://github.com/Tomcy-wcc/blog.git
再采用git log命令查看提交历史
[root@localhost blog]# git log
commit 09bdf9e37b6074b8b47cca8128971e12917f243a
Author: Tomcy-wcc <35038733+Tomcy-wcc@users.noreply.github.com>
Date: Thu Aug 29 15:52:04 2019 +0800
Set theme jekyll-theme-cayman
commit 9b4f296a4d809490918733ef1657c6542a811f7d
Author: wucc <2325393052@qq.com>
Date: Thu Aug 1 10:47:22 2019 +0800
修复一些全文搜索bug
commit bbe137bd782f8e14eed5e1705ce5c25f5770a8ba
Merge: 1cfcb45 0efd949
Author: wucc <2325393052@qq.com>
Date: Thu Aug 1 09:42:41 2019 +0800
Merge remote-tracking branch 'origin/master'
commit 1cfcb45ea42296fae2179ee449091922432b175f
Author: wucc <2325393052@qq.com>
Date: Thu Aug 1 09:42:13 2019 +0800
完成了lucene对博客标题的全文检索并使用rest风格查看搜索结果
git log 有许多选项可以帮助你搜寻你所要找的提交, 接下来我们介绍些最常用的。
一个常用的选项是 -p,用来显示每次提交的内容差异。 你也可以加上 -2 来仅显示最近两次提交
[root@localhost blog]# git log -p -2
commit 09bdf9e37b6074b8b47cca8128971e12917f243a
Author: Tomcy-wcc <35038733+Tomcy-wcc@users.noreply.github.com>
Date: Thu Aug 29 15:52:04 2019 +0800
Set theme jekyll-theme-cayman
diff --git a/_config.yml b/_config.yml
new file mode 100644
index 0000000..c419263
--- /dev/null
+++ b/_config.yml
@@ -0,0 +1 @@
+theme: jekyll-theme-cayman
\ No newline at end of file
commit 9b4f296a4d809490918733ef1657c6542a811f7d
Author: wucc <2325393052@qq.com>
Date: Thu Aug 1 10:47:22 2019 +0800
...
如果你想看到每次提交的简略的统计信息,你可以使用 --stat 选项
[root@localhost blog]# git log --star
fatal: unrecognized argument: --star
[root@localhost blog]# git log --stat
commit 09bdf9e37b6074b8b47cca8128971e12917f243a
Author: Tomcy-wcc <35038733+Tomcy-wcc@users.noreply.github.com>
Date: Thu Aug 29 15:52:04 2019 +0800
Set theme jekyll-theme-cayman
_config.yml | 1 +
1 file changed, 1 insertion(+)
commit 9b4f296a4d809490918733ef1657c6542a811f7d
Author: wucc <2325393052@qq.com>
Date: Thu Aug 1 10:47:22 2019 +0800
修复一些全文搜索bug
.../java/com/yc/shiro/controller/BlogController.java | 1 +
src/main/java/com/yc/shiro/lucene/LuceneService.java | 5 +-
src/main/java/stopword.dic | 274 ----------------------
3 files changed, 4 insertions(+), 276 deletions(-)
commit bbe137bd782f8e14eed5e1705ce5c25f5770a8ba
Merge: 1cfcb45 0efd949
另外一个常用的选项是 --pretty。 这个选项可以指定使用不同于默认格式的方式展示提交历史。 这个选项有
一些内建的子选项供你使用。 比如用 oneline 将每个提交放在一行显示,查看的提交数很大时非常有用。 另外
还有 short,full 和 fuller 可以用,展示的信息或多或少有些不同,
[root@localhost blog]# git log --pretty=oneline
09bdf9e37b6074b8b47cca8128971e12917f243a Set theme jekyll-theme-cayman
9b4f296a4d809490918733ef1657c6542a811f7d 修复一些全文搜索bug
bbe137bd782f8e14eed5e1705ce5c25f5770a8ba Merge remote-tracking branch 'origin/master
1cfcb45ea42296fae2179ee449091922432b175f 完成了lucene对博客标题的全文检索并使用rest
0efd94915ad7f04bbf05e8774f4b9a9b21105f16 Update mail.properties
b86b03a2c2e5e1f3a965784341eccc572a3fa22f 完成了lucene对博客标题的全文检索
7794f21688d900cedef0612c7650c163a83ded41 入门lucene全文检索
c478c3586616b1bfa368020b27623b8e07f5b560 完成了后台权限设置
d42d874d2efad464846d1019bfadf4d985b8ad7f Merge remote-tracking branch 'origin/master
b2bbc8589283490cff08fedb7f80e6cf5105de8d 完成了消息回复和登录失败错误处理功能
7b1c079301d975c1fff359998b838dc828a72dc8 Delete .gitattributes
6b21f83ebace2b03c631df48aa12e5ce16188123 修改git上项目显示的语言为Java
7ffbd9fe4467ecc6dcd568c0b35bff1116e1a1b5 消息管理,完成了对消息的显示,删除和批量删
0a86894fa2fd933e3fb31f150a107d0f1239cc98 修复了一些登入上的bug,与cookie有关
353c4e7360cbd5fc3b6042b8050f7b2250bcb26a 文章管理完成
d118763d164c69cd0109640fb50c2dc6258d8bb8 文章管理完成
624c6bf79d129658fdabcd71a906a1e3915d2fa0 Initial commit
但最有意思的是 format,可以定制要显示的记录格式。 这样的输出对后期提取分析格外有用 ,因为你知道输出的格式不会随着 Git 的更新而发生改变。当 oneline 或 format 与另一个 log 选项 --graph 结合使用时尤其有用。 这个选项添加了一些 ASCII 字符串来形象地展示你的分支、合并历史:
[root@localhost blog]# git log --pretty=format"%h - %an, %ar : %s" --graph
* format09bdf9e - Tomcy-wcc, 11 days ago : Set theme jekyll-theme-cayman
* format9b4f296 - wucc, 6 weeks ago : 修复一些全文搜索bug
* formatbbe137b - wucc, 6 weeks ago : Merge remote-tracking branch 'origin/master'
|\
| * format0efd949 - Tomcy-wcc, 6 weeks ago : Update mail.properties
* | format1cfcb45 - wucc, 6 weeks ago : 完成了lucene对博客标题的全文检索并使用rest风
|/
* formatb86b03a - wucc, 6 weeks ago : 完成了lucene对博客标题的全文检索
* format7794f21 - wucc, 6 weeks ago : 入门lucene全文检索
* formatc478c35 - wucc, 6 weeks ago : 完成了后台权限设置
* formatd42d874 - wucc, 6 weeks ago : Merge remote-tracking branch 'origin/master'
|\
| * format7b1c079 - Tomcy-wcc, 6 weeks ago : Delete .gitattributes
* | formatb2bbc85 - wucc, 6 weeks ago : 完成了消息回复和登录失败错误处理功能
|/
* format6b21f83 - wucc, 6 weeks ago : 修改git上项目显示的语言为Java
* format7ffbd9f - wucc, 6 weeks ago : 消息管理,完成了对消息的显示,删除和批量删除功
* format0a86894 - wucc, 7 weeks ago : 修复了一些登入上的bug,与cookie有关
* format353c4e7 - wucc, 7 weeks ago : 文章管理完成
* formatd118763 - wucc, 7 weeks ago : 文章管理完成
* format624c6bf - Tomcy-wcc, 7 weeks ago : Initial commit
git log --pretty=format 常用的选项
选项 | 说明 |
---|---|
%H | 提交对象(commit)的完整哈希字串 |
%h | 提交对象的简短哈希字串 |
%T | 树对象(tree)的完整哈希字串 |
%t | 树对象的简短哈希字串 |
%P | 父对象(parent)的完整哈希字串 |
%p | 父对象的简短哈希字串 |
%an | 作者(author)的名字 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(可以用 --date= 选项定制格式) |
%ar | 作者修订日期,按多久以前的方式显示 |
%cn | 提交者(committer)的名字 |
%ce | 提交者的电子邮件地址 |
%cd | 提交日期 |
%cr | 提交日期,按多久以前的方式显示 |
%s | 提交说明 |
撤消操作
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选
项的提交命令尝试重新提交:
[root@localhost ssm]# git log
commit 6cc1b3dd77403b4553bb898535057de9104272a0
Author: tomcy <744476408@qq.com>
Date: Mon Sep 9 19:38:43 2019 +0800
story 182
[root@localhost ssm]# echo "test" > first.txt
[root@localhost ssm]# git add first.txt
//撤消操作
[root@localhost ssm]# git commit -m "story 183" --amend
[master c3ae862] story 183
5 files changed, 8 insertions(+)
create mode 100644 .gitignore
create mode 100644 README
create mode 100644 a.txt
create mode 100644 first.txt
create mode 100644 php/php.txt
[root@localhost ssm]# git log
commit c3ae862385c230f282531008eaea565cad4c8304
Author: tomcy <744476408@qq.com>
Date: Mon Sep 9 19:38:43 2019 +0800
story 183
最终你只会有一个提交——第二次提交将代替第一次提交的结果。
取消暂存的文件
如何取消暂存呢? git status 命令提示了你:
[root@localhost ssm]# echo "hh" > hh.txt
[root@localhost ssm]# git add hh.txt
[root@localhost ssm]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: hh.txt
#
在 “Changes to be committed” 文字正下方,提示使用 git reset HEAD <file>... 来取消暂存。 所
以,我们可以这样来取消暂存 CONTRIBUTING.md 文件:
[root@localhost ssm]# git reset HEAD hh.txt
[root@localhost ssm]# git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# hh.txt
nothing added to commit but untracked files present (use "git add" to track)
撤消对文件的修改
如果你并不想保留对 CONTRIBUTING.md 文件的修改怎么办? 你该如何方便地撤消修改——将它还原成上次提
交时的样子(或者刚克隆完的样子,或者刚把它放入工作目录时的样子)? 幸运的是,git status 也告诉了
你应该如何做。 在最后一个例子中,未暂存区域是这样:
[root@localhost ssm]# vim hh.txt
[root@localhost ssm]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: hh.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: hh.txt
#
它非常清楚地告诉了你如何撤消之前所做的修改(use "git checkout -- <file>..." to discard changes in working directory)。 让我们来按照提示执行:
[root@localhost ssm]# git checkout -- hh.txt
[root@localhost ssm]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: hh.txt
#
可以看到那些修改已经被撤消了。
远程仓库的使用
查看远程仓库
如果想查看你已经配置的远程仓库服务器,可以运行 git remote 命令。 它会列出你指定的每一个远程服务器
的简写。 如果你已经克隆了自己的仓库,那么至少应该能看到 origin ——这是 Git 给你克隆的仓库服务器的默认
名字,你也可以指定选项 -v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。
[root@localhost blog]# git remote
origin
[root@localhost blog]# git remote -v
origin https://github.com/Tomcy-wcc/blog.git (fetch)
origin https://github.com/Tomcy-wcc/blog.git (push)
如果你的远程仓库不止一个,该命令会将它们全部列出。
添加远程仓库
运行 git remote add <shortname> <url> 添加一个新的远程 Git 仓库,同时指定一个你可以轻松引用的简写:
//先从github上克隆一个项目下来
[root@localhost test]# git clone https://github.com/Tomcy-wcc/Git_test.git
Cloning into 'Git_test'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
[root@localhost test]# cd Git_test/
[root@localhost Git_test]# git remote
origin
[root@localhost Git_test]# git remote -v
origin https://github.com/Tomcy-wcc/Git_test.git (fetch)
origin https://github.com/Tomcy-wcc/Git_test.git (push)
//添加远程仓库
[root@localhost Git_test]# git remote add blog https://github.com/Tomcy-wcc/blog.git[root@localhost Git_test]# git remote -v
blog https://github.com/Tomcy-wcc/blog.git (fetch)
blog https://github.com/Tomcy-wcc/blog.git (push)
origin https://github.com/Tomcy-wcc/Git_test.git (fetch)
origin https://github.com/Tomcy-wcc/Git_test.git (push)
现在你可以在命令行中使用字符串 pb 来代替整个 URL。 例如,如果你想拉取 Paul 的仓库中有但你没有的信
息,可以运行 git fetch pb:
[root@localhost Git_test]# git fetch blog
warning: no common commits
remote: Enumerating objects: 471, done.
remote: Counting objects: 100% (471/471), done.
remote: Compressing objects: 100% (271/271), done.
remote: Total 471 (delta 156), reused 424 (delta 120), pack-reused 0
Receiving objects: 100% (471/471), 1.18 MiB | 18.00 KiB/s, done.
Resolving deltas: 100% (156/156), done.
From https://github.com/Tomcy-wcc/blog
* [new branch] master -> blog/master
从远程仓库中抓取与拉取
就如刚才所见,从远程仓库中获得数据,可以执行:
[root@localhost Git_test]# git fetch [remote-name]
这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支
的引用,可以随时合并或查看。如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch 命令会将数据拉取到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作
推送到远程仓库
当你想分享你的项目时,必须将其推送到上游。 这个命令很简单:git push [remote-name] [branchname]。 当你想要将 master 分支推送到 origin 服务器时(再次说明,克隆时通常会自动帮你设置好那两个
名字),那么运行这个命令就可以将你所做的备份到服务器:
[root@localhost Git_test]# echo "first push" > first_push.txt
[root@localhost Git_test]# git add .
[root@localhost Git_test]# git commit -m "first push"
[master 065e9ac] first push
1 file changed, 1 insertion(+)
create mode 100644 first_push.txt
//推送到远程仓库
[root@localhost Git_test]# git push origin master
Username for 'https://github.com': Tomcy-wcc
Password for 'https://Tomcy-wcc@github.com':
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 285 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/Tomcy-wcc/Git_test.git
66f2b9a..065e9ac master -> master
只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。 当你和其他人在同一时
间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。 你必须先将他们的工作拉
取下来并将其合并进你的工作后才能推送。
查看某个远程仓库
如果想要查看某一个远程仓库的更多信息,可以使用 git remote show [remote-name] 命令。 如果想以
一个特定的缩写名运行这个命令,例如 origin,会得到像下面类似的信息:
[root@localhost Git_test]# git remote show origin
* remote origin
Fetch URL: https://github.com/Tomcy-wcc/Git_test.git
Push URL: https://github.com/Tomcy-wcc/Git_test.git
HEAD branch: master
Remote branch:
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
它同样会列出远程仓库的 URL 与跟踪分支的信息。 这些信息非常有用,它告诉你正处于 master 分支,并且如
果运行 git pull,就会抓取所有的远程引用,然后将远程 master 分支合并到本地 master 分支。 它也会列出拉取
到的所有远程引用。
远程仓库的移除与重命名
如果想要重命名引用的名字可以运行 git remote rename 去修改一个远程仓库的简写名。
例如,想要将 origin重命名为 git_test,可以用 git remote rename 这样做:
[root@localhost Git_test]# git remote rename origin git_test
[root@localhost Git_test]# git remote
blog
git_test
如果因为一些原因想要移除一个远程仓库——你已经从服务器上搬走了或不再想使用某一个特定的镜像了,又或
者某一个贡献者不再贡献了——可以使用 git remote rm :
[root@localhost Git_test]# git remote rm blog
[root@localhost Git_test]# git remote
git_test