Git学习——Git基础篇
前言
关于Git学习系列,为了监督自己学习Git而做的笔记,今后遗忘时也可以快速查找。内容只有命令行下的Git操作,不包含Git的安装,GUI版本的使用。Git基础篇是为了快速掌握Git的使用。
目录
用户信息
Git安装完成后的第一件事就是设置用户名称与邮件地址。每一个Git的提交都将会使用这些信息,并且写入每一次提交中。当想针对特定项目使用不同的用户名称和邮箱地址时,可以在相应项目的目录下执行没有 --global选项的命令来配置。
$ git config --global user.name "Jay Jude"
$ git config --global uset.email JayJude@example.com
文本编辑器
用户信息设置完毕,可以配置默认的文本编辑器了,当Git需要输入信息时会调用它。如果未配置,Git会使用操作系统默认的文本编辑器(通常在安装时会要求选择)。如果下使用不同的文本编辑器,例如Emacs,可以这样做。
Vim和Emacs是像Linux和Mac等基于Unix的系统上开发者经常使用的流行的文本编辑器。如果使用的是Windows系统,则可能需要自行搜索如何配置你常用的编辑器。
$ git config --global core.editor emacs
检查配置信息
如果想要检查你的所有配置信息,可以使用如下命令。
$ git config --list
core.symlinks=false
core.autocrlf=true
core.fscache=true
color.diff=auto
color.status=auto
...
你也可以输入git config 来查看Git某一项配置。
$ git config user.name
Jay Judge
获取帮助
若你使用Git时需要获取帮助,有三种方法可以找到Git命令的使用手册。执行命令将会打开相应的网页使用手册,其实可以在Git\mingw64\share\doc\git-doc(不同版本位置可能不同)目录中自行查看。
第三种方法在Windows操作系统上无效。
$ git help <key>
$ git <key> --help
$ man git-<key>
获取Git仓库
获取Git项目仓库的方法有两种。第一种是在现有项目目录下将所有文件导入到Git中;第二种是从服务器克隆一个现有的Git仓库。
在现有目录中初始化仓库
如果打算使用Git来对现有的项目进行管理,只需要切换到相应目录并输入以下命令
$ git init
该命令将在目录下创建一个名为.git的子目录,这个子目录含有初始化的Git仓库中所有的必须文件。此时,仅仅做了一个初始化的操作,项目里面的文件还没有被跟踪。如果是在非空项目下初始化,想要跟踪目录的文件,可以执行 git add [filename] 命令来实现对指定的文件的跟踪,然后执行 git commit 提交。
$ git add *.c
$ git add LICENSE
$ git add README
...
$ git commit -m "initial project verison"
具体的指令稍后解释。目前,你已经得到了一个有若干文件的Git仓库。
克隆现有的仓库
如果想获得一份存在的Git仓库的拷贝。克隆仓库的命令格式是 git clone [url], 例如我克隆Github仓库里的test库,可以使用以下命令。
$ git clone https://github.com/Jayjudge/test
如果想要在本地定义本地仓库的名字,可以在后面加上名字。
$ git clone https://github.com/JayJudeg/test Hello
记录每次更新到仓库
现在我们已经有了一个Git仓库。首先,工作目录下的每一个文件有两种状态:已跟踪和未跟踪。
已跟踪的文件是指被纳入了版本控制的文件,在上一次快照中有它们的记录,随着文件修改,它们的状态可能处于未修改,已修改或已放入暂存区。除了已跟踪的文件都是未跟踪文件。刚刚克隆的仓库中所有文件都属于已跟踪文件,并处于未修改状态。
当文件被编辑后,则自上次提交后发生了修改,处于已修改状态。我们将器放入暂存区,然后提交修改。这样反复下去,Git使用时文件的状态如下。
操作 | 初始状态 | 目标状态 |
---|---|---|
add the file | 未追踪 | 暂存 |
edit the file | 未修改 | 已修改 |
stage the file | 已修改 | 暂存 |
remove the file | 未修改 | 未追踪 |
commit | 暂存 | 未修改 |
检查当前文件状态
要查看当前文件处于什么状态,可以使用 git status 命令。会有类似如下的输出。这是一个空的仓库显示的信息,工作目录很干净。
$ git status
On branch master
No commits yet
nothing to commit(create/copy files and use "git add" to track)
现在,在目录下创建一个新的README文件,再次使用 git status 命令。
$ git status
On branch master
No commits yet
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跟踪,如括号中提示的一样,需要执行 git add 命令来跟踪文件。例如,我们跟踪README文件再查看状态。
$ git add README
此时README处于暂存状态
$ git status
On branch master
No commits yet
Changes to be commited:
(use "git rm --cahed <file>..." to unstage)
new file: README
暂存已修改文件
假如我们修改了一个已经存在的文件(这里用FILE.md演示),再查看状态将会出现以下信息。
$ git staus
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: FILE.md
同样,我们使用 git add 命令将FILE.md提交到暂存状态。
$ git add FILE.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: FILE.md
new file: README
这里两个文件都已经到暂存区了,下一步执行的应该是提交,不过在此之前,先看这样一个例子。我们再次修改FILE.md并查看状态
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: FILE.md
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: FILE.md
为什么FILE.md会同时出现在暂存区和非暂存区?实际上Git只是暂存了你运行 git add 命令时的版本,如果现在提交,提交的时最后一次执行add 的版本,而不是当前修改后的版本。所以需要重新add暂存,再执行commit提交。
状态简览
git status 命令的输出十分详细,如果使用 -s 或 --short 附加命令,则会得到一个更简洁的报告输出。
$ git status -s
MM FILE.md
A README
?? abc.txt
未追踪的文件前有两个问号,如abc.txt前的??
A表示已经暂存
两个M,左边表示修改了并已经放入暂存区,右边表示修改了但未放入暂存区
忽略文件
一般情况下,我们希望有一些文件不被Git纳入管理,也不希望出现再未跟踪文件的列表里。比如自动生成的文件等等。我们可以创建一个名为 .gitignore的文件(注意不是文件夹),列出要忽略的文件模式,举个例子。
vim .gitignore
*.[oa]
*._
第一行告诉Git忽略所有的以 .o 或 .a 结尾的文件。 第二行告诉Git忽略所有的以 .~ 结尾的文件。
文件 .gitignore 的格式规范如下:
- 所有空行或者以 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配。
- 匹配模式可以以( / )开头防止递归。
- 匹配模式可以以( / )结尾指定目录。
要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号( ! )取反。
这里给出一个例子。
# 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
Github 有一个十分详细的针对十种项目及语言的 .gitignore 文件列表,你可以在 https://github.com/github/gitignore 中找到它。
查看已暂存和未暂存的修改
如果 git status 命令的输出对于你来说过于模糊,你想知道具体修改了什么地方,可以用 git diff 命令。 稍后我们会详细介绍 git diff ,你可能通常会用它来回答这两个问题:当 前做的哪些更新还没有暂存? 有哪些更新已经暂存起来准备好了下次提交? 尽管 git status 已经通过在相应栏下列出文件名的方式回答了这个问题, git diff 将通过文件补丁 的格式显示具体哪些行发生了改变。
如果再次修改README文件暂存,修改FILE.md不暂存,运行 status 命令将得到。
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: 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: FILE.md
而直接输入 git diff 可以得到。
$ git diff
warning: LF will be replaced by CRLF in FILE.md.
The file will have its original line endings in your working directory
diff --git a/FILE.md b/FILE.md
index 591202e..1fee42e 100644
--- a/FILE.md
+++ b/FILE.md
@@ -1 +1,2 @@
-iad
+ad
+sda
如果暂存FILE.md后再编辑,运行status将得到两个版本。
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: 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: FILE.md
运行 git diff看暂存前后的变化。
$ git diff
warning: LF will be replaced by CRLF in FILE.md.
The file will have its original line endings in your working directory
diff --git a/FILE.md b/FILE.md
index 1fee42e..ab60170 100644
--- a/FILE.md
+++ b/FILE.md
@@ -1,2 +1,2 @@
-ad
+
sda
运行 git diff --cached 查看已经暂存的变化。(--staged 和 --cached相同,在旧的版本中只有cached)
$ git diff --cached
diff --git a/FILE.md b/FILE.md
index 591202e..1fee42e 100644
--- a/FILE.md
+++ b/FILE.md
@@ -1 +1,2 @@
-iad
+ad
+sda
如果你喜欢通过图形化的方式或其它格式输出方式的话,可以使用 git difftool 命令来用 Araxis ,emerge 或 vimdiff 等软件输出 diff 分析结果。 使用 git difftool --tool-help 命令来看你的系统支持哪些 Git Diff 插件。
提交更新
' 在所有文件暂存后,可以进行提交。提交前最好查看 status 以确保所有文件都已经暂存。然后执行 git commit。
$ git commit
这种方式会启动文本编辑器以输入本次提交的说明,这里前面已经提到过。编辑器会显示类似下面的信息(这里用vim的显示方式举例)。
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Changes to be committed:
# modified: FILE.md
# modified: README
#
当保存关闭编辑的内容时会显示以下类似的信息。
[master 507b767] nothing
2 files changed, 3 insertions(+), 1 deletion(-)
你也可以使用 commit 的 -m 选项直接在后面添加提交说明,将会得到类似信息。
$ git commit -m "Version 0.0.1"
[master aea46ec] Version 0.0.1
2 files changed, 5 insertions(+), 1 deletion(-)
跳过使用暂存区域
为了使用起来更加简洁方便,对于已经追踪的文件,我们可以不需要再次 add 来暂存,在 commit 的时候加上 -a 选项会自动把已经追踪的文件暂存起来并一起提交,再次修改README来演示。
$ git status
On branch master
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: README
no changes added to commit (use "git add" and/or "git commit -a")
$ git commit -a -m "add new infomation"
[master 768d6c4] add new infomation
1 file changed, 1 insertion(+), 1 deletion(-)
移除文件
如果想要在Git仓库中移除一个文件(这里指已经被追踪的文件),可以执行 git rm 命令完成,并且会从工作目录中删除指定的文件。如果只是删除这个文件,运行 status 会出现类型以下信息(这里用 Hello.c 举例)。
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: Hello.c
no changes added to commit (use "git add" and/or "git commit -a")
此时你需要再次执行 git rm 命令来使Git记录这次操作,注意比较两个 status 的不同,这样下次提交时,这个文件就不会再纳入版本管理。
$ git rm Hello.c
rm 'Hello.c'
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: Hello.c
如果文件删除之前修改过并且已经放到暂存区的话,则必须用 -f 选项。 这是一种安全特性,用 于防止误删还没有添加到快照的数据,这样的数据不能被 Git 恢复。
如果想要再Git仓库记录中移除文件,但仍然希望它保存再工作目录下。而你又没有将其放在 .gitignore 中,可以再rm时加上 --cached 选项。
git rm 命令后面可以接文件名,也可以接目录名,或者使用glob模式(是Git利用正则表达式的一种方式)。
git rm \*~
例如这条命令删除所有以~结尾的所有文件。
移动文件
不像其它的 VCS 系统,Git 并不显式跟踪文件移动操作。 如果在 Git 中重命名了某个文件,仓库中存储的元数据并不会体现出这是一次改名操作。既然如此,当你看到 Git 的 mv 命令时一定会困惑不已。 要在 Git 中对文件改名,可以这么做:
$ git rm file_from file_to
这样,Git将会知道这是一个重命名操作。
$ git mv README README.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README -> README.md
其实这相当于执行了以下命令。
$ mv README README.md
$ git rm README
$ git add README.md
查看历史提交
在执行了若干提交后,又或者克隆了某个项目后,也许想知道有哪些提交历史,执行 git log 命令将会完成这一工作。
git log
commit 1f87773d5c23dfaf739b5eee852f75169ba3eeb7 (HEAD -> master)
Author: Jay Judge <jayjudge@exa.com>
Date: Mon Jan 21 14:56:19 2019 +0800
rename README
commit 938cfff73060f876eef6433d6866b4b72ed2a89a
Author: Jay Judge <jayjudge@exa.com>
Date: Mon Jan 21 14:48:12 2019 +0800
del Hello.c
commit 6409395cfb006ae6b1c64bf89444f6c7c6f00152
Author: Jay Judge <jayjudge@exa.com>
Date: Mon Jan 21 14:16:05 2019 +0800
Hello.c
commit 768d6c4f3f6de64fb8dc7d964fa7264f7e49b104
Author: Jay Judge <jayjudge@exa.com>
Date: Mon Jan 21 14:09:19 2019 +0800
add new infomation
默认不用任何参数的话, git log 会按提交时间列出所有的更新,最近的更新排在最上面。正如你所看到的,这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、 提交时间以及提交说明。
git log 还有许多帮助搜索想要的提交的选项,最常用的是 -p,用来显示提交的内容的差异。也可以加上 -n 来显示最近n条记录。
$ git log -p -2
commit 1f87773d5c23dfaf739b5eee852f75169ba3eeb7 (HEAD -> master)
Author: Jay Judge <jayjudge@exa.com>
Date: Mon Jan 21 14:56:19 2019 +0800
rename README
diff --git a/README b/README.md
similarity index 100%
rename from README
rename to README.md
commit 938cfff73060f876eef6433d6866b4b72ed2a89a
Author: Jay Judge <jayjudge@exa.com>
Date: Mon Jan 21 14:48:12 2019 +0800
del Hello.c
diff --git a/Hello.c b/Hello.c
deleted file mode 100644
index e69de29..0000000
--stat 选项可以显示每次提交的简略统计信息。
$ git log --stat -1
commit 1f87773d5c23dfaf739b5eee852f75169ba3eeb7 (HEAD -> master)
Author: Jay Judge <158524693@qq.com>
Date: Mon Jan 21 14:56:19 2019 +0800
rename README
README => README.md | 0
1 file changed, 0 insertions(+), 0 deletions(-)
--pretty 选项可以指定不同的格式显示提交历史,可选参数有oneline、short、full、fuller和format,下面给出例子仅供参考。
oneline
$ git log --pretty=oneline -3
1f87773d5c23dfaf739b5eee852f75169ba3eeb7 (HEAD -> master) rename README
938cfff73060f876eef6433d6866b4b72ed2a89a del Hello.c
6409395cfb006ae6b1c64bf89444f6c7c6f00152 Hello.c
short
$ git log --pretty=short -1
commit 1f87773d5c23dfaf739b5eee852f75169ba3eeb7 (HEAD -> master)
Author: Jay Judge <jayjudge@exa.com>
rename README
full
$ git log --pretty=full -1
commit 1f87773d5c23dfaf739b5eee852f75169ba3eeb7 (HEAD -> master)
Author: Jay Judge <jayjudge@exa.com>
Commit: Jay Judge <jayjudge@exa.com>
rename README
fuller
$ git log --pretty=fuller -1
commit 1f87773d5c23dfaf739b5eee852f75169ba3eeb7 (HEAD -> master)
Author: Jay Judge <158524693@qq.com>
AuthorDate: Mon Jan 21 14:56:19 2019 +0800
Commit: Jay Judge <158524693@qq.com>
CommitDate: Mon Jan 21 14:56:19 2019 +0800
rename README
format参数可以定制输出信息。
$ git log --pretty=format:"%h - %an, %ar : %s" -3
1f87773 - Jay Judge, 18 minutes ago : rename README
938cfff - Jay Judge, 26 minutes ago : del Hello.c
6409395 - Jay Judge, 58 minutes ago : Hello.c
下面给出一些常用的format参数。
选项 | 说明 |
---|---|
%H | 提交对象(commit)的完整哈希字串 |
%h | 提交对象的简短哈希字串 |
%T | 树对象(tree)的完整哈希字串 |
%t | 树对象的简短哈希字串 |
%P | 父对象(parent)的完整哈希字串 |
%p | 父对象的简短哈希字串 |
%an | 作者(author)的名字 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(可以用 --date= 选项定制格式) |
%ar | 作者修订日期,按多久以前的方式显示 |
%cn | 提交者(committer)的名字 |
%ce | 提交者的电子邮件地址 |
%cd | 提交日期 |
%cr | 提交日期,按多久以前的方式显示 |
%s | 提交说明 |
当 oneline 或 format 与另一个 log 选项 --graph 结合使用时尤其有用。 这个选项添加了一些ASCII字符串来形象地展示你的分支、合并历史,这将在后面讲述。下面给出一些常用的log选项。
选项 | 说明 |
---|---|
-p | 按补丁格式显示每个更新之间的差异。 |
--stat | 显示每次更新的文件修改统计信息。 |
--shortstat | 只显示 --stat 中最后的行数修改添加移除统计。 |
--name-only | 仅在提交信息后显示已修改的文件清单。 |
--name-status | 显示新增、修改、删除的文件清单。 |
--abbrev-commit | 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。 |
--relative-date | 使用较短的相对时间显示(比如,“2 weeks ago”)。 |
--graph | 显示 ASCII 图形表示的分支合并历史。 |
--pretty | 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。 |
-(n) | 仅显示最近的 n 条提交 |
--since , --after | 仅显示指定时间之后的提交。 |
--until , --before | 仅显示指定时间之前的提交。 |
--author | 仅显示指定作者相关的提交。 |
--committer | 仅显示指定提交者相关的提交。 |
--grep | 仅显示含指定关键字的提交 |
-S | 仅显示添加或移除了某个关键字的提交 |
撤销操作
在任何一个阶段,你都有可能想要撤消某些操作。 这里是几个撤消所做修改的基本工具。 注意,有些撤消操作是不可逆的。 这是在使用 Git 的过程中,会因为操作失误而导致之前的工作丢失的少有的几个地方之一。有时候提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令尝试重新提交。
$ git commit --amend
如果自上次提交以来还未做出如何修改,那么改变的只有提交信息。例如忘记暂存某些需要的修改,可以如下操作。
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
取消暂存的文件
操作暂存区域与工作目录中已修改的文件, 这些命令在修改文件状态的同时,也会提示如何撤消操作。 例如,你已经修改了两个文件并且想要将它们作为两次独立的修改提交,但是却意外地输入了 git add * 暂存了它们两个。 如何只取消暂存两个中的一个呢? git status 命令会给出提示。
$ git add *
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: FILE.md
renamed: README.md -> README
use "git reset HEAD ..." to unstage 提示可以取消暂存,下面取消FILE.md的暂存。
$ git reset HEAD FILE.md
Unstaged changes after reset:
M FILE.md
再查看此时的 status。
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> 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: FILE.md
撤销文件的修改
如果不行保留对 FILE.md 的修改,想要将它还原成上次提交的样子,或者刚刚克隆完的样子怎么办?仔细查看上面的 status 信息不难发现,Git 仍然给了我们提示,使用 checkout命令。
$ git checkout -- FILE.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
记住,在 Git 中任何 已提交的 东西几乎总是可以恢复的。 甚至那些被删除的分支中的提交或使用 --amend 选项覆盖的提交也可以恢复。 然而,任何你未提交的东西丢失后很可能再也找不到了。
远程仓库的使用
为了能在任意 Git 项目上协作,你需要知道如何管理自己的远程仓库。 远程仓库是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只 读,有些则可以读写。 与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。 管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓库、管理不同的远程分支并定义它们是否被跟踪等等。
查看远仓库
如果想查看你已经配置的远程仓库服务器,可以运行 git remote 命令。 它会列出你指定的每一个远程服务器的简写。 如果你已经克隆了自己的仓库,那么至少应该能看到 origin 这是Git 给你克隆的仓库服务器的默认名字。
先克隆一个远程库。
$ git clone https://github.com/jayjudge/test2 Test
Cloning into 'Test'...
remote: Enumerating objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Unpacking objects: 100% (3/3), done.
切换到相应的目录,执行git remote
$ cd Test
$ git remote
origin
也可以指定选项 -v 查看远程仓库使用的Git保存的与其对应的URL。
$ git remote -v
origin https://github.com/jayjudge/test2 (fetch)
origin https://github.com/jayjudge/test2 (push)
如果有几个人协作的仓库,拥有多个远程仓库看起来像下面这样。
$ git remote -v
jayjudge https://github.com/jayjudge/test2 (fetch)
jayjude https://github.com/jayjudge/test2 (push)
abc https://github.com/abc/test2 (fetch)
abc https://github.com/abc/test2 (push)
jeff https://github.com/jeff/test2 (fetch)
jeff https://github.com/jeff/test2 (push)
如果想要查看一个远程仓库的更多信息,可以执行 git remote show [remote-name]命令。
$ git remote show origin
* remote origin
Fetch URL: https://github.com/jayjudge/test2
Push URL: https://github.com/jayjudge/test2
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)
添加远程仓库
执行 git remote add 添加一个新的远程查看,同时指定一个可以轻松引用的简写。
$ git remote add pd https://github.com/panda/test2
$ git remote -v
origin https://github.com/jayjudge/test2 (fetch)
origin https://github.com/jayjudge/test2 (push)
pd https://github.com/panda/test2 (fetch)
pd https://github.com/panda/test2 (push)
如果你想要拉取 panda 的仓库中你没有的信息, 可以运行 git fetch pd。
$ git fetch pd
From https://github.com/panda/test2
* [new branch] master -> pd/master
从远程仓库中抓取与拉取
从远程仓库获取数据,可以执行。
$ git fetch [remote-name]
这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远 程仓库中所有分支的引用,可以随时合并或查看。
如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 origin 为简写。 所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch 命令会将数据拉取到你的本地仓库,它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。
如果你有一个分支设置为跟踪一个远程分支,可以使用 git pull 命令来自动的抓取然后合并远程分支到当前分支。 这对你来说可能是一个更简单或更舒服的工作流程;默认情况下, git clone 命令会自动设置本地 master分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默认分支)。 运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
推送到远程仓库
当需要将项目分享时推送到上服务器时,需要执行 git push [remote-name] [branch-name]。
$ git push origin master
只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。 当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问 地被拒绝。 你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送。
远程仓库的移除与重命名
对于重命名,可以执行 git remote rename。例如将pd 改为 panda。
$ git remote rename pd panda
$ git remote
origin
panda
如果因为一些原因想要移除一个远程仓库 - 你已经从服务器上搬走了或不再想使用某一个特定的镜像了,又或者某一个贡献者不再贡献了 - 可以使用 git remote rm 。
$ git remote rm panda
$ git remote
origin
版本标签
像其他版本控制系统(VCS)一样,Git 可以给历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 等等)。
列出标签
列出标签可以执行 git tag 命令。
$ git tag
v0.1
v1.3
当标签信息比较多,标签数量较多,可以查看相同前缀的标签。
$ git tag -l 'v1.8.5*'
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
创建标签
Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)。然而,附注标签是存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。 通常建议创建附注标签,这样你可以拥有以上所有信息;但是如果你只是想用一个临时的标签,或者因为某些原因不想要保存那些信息,轻量标签也是可用的。
附注标签
在 Git 中创建一个附注标签是很简单的。 最简单的方式是当你在运行 tag 命令时指定 -a 选项。
$ git tag -a v0.1 -m "Version 0.1"
执行 git tag 查看
$ git tag
v0.1
执行 git show [tag-name] 查看详细信息。
$ git show v0.1
tag v0.1
Tagger: Jay Judge <158524693@qq.com>
Date: Tue Jan 22 15:48:12 2019 +0800
Version 0.1
commit f2be5869e811a4496a642e40cab1ce69dfd3037e (HEAD -> master, tag: v0.1, origin/master, origin/HEAD)
Author: JayJudge <jayjudge@exm.com>
Date: Sat Apr 7 15:02:12 2018 +0800
create a new text named 123
diff --git a/123.txt b/123.txt
new file mode 100644
index 0000000..e69de29
轻量标签
另一种给提交打标签的方式是使用轻量标签。 轻量标签本质上是将提交校验和存储到一个文件中 - 没有保存任何其他信息。 创建轻量标签,不需要使用 -a 、 -s 或 -m 选项,只需要提供标签名字。
$ git tag v1.4-lw
$ git tag
v0.1
v1.4
v1.4-lw
v1.5
后期标签
如果想要对已经提交的历史打标签,可以如下操作。
先执行 git log 查看对应的哈希码。
$ git log --pretty=oneline
45e5714646a1d002c67b7d18b7811509bd3afd85 (HEAD -> master) ad Hello.c
b1b3ad8e1385de20b4310b0d887a563ed18bc521 modify Hello.c
dc48cd9c0743c69a5a9a17653292049a4e23f7e3 add Hello.c
1f87773d5c23dfaf739b5eee852f75169ba3eeb7 rename README
938cfff73060f876eef6433d6866b4b72ed2a89a del Hello.c
6409395cfb006ae6b1c64bf89444f6c7c6f00152 Hello.c
768d6c4f3f6de64fb8dc7d964fa7264f7e49b104 add new infomation
假如我想在 rename README 处添加标签。
$ git tag -a v0.2 1f87773
这样就添加了标签,下面查看详细信息。
$ git show v0.2
tag v0.2
Tagger: Jay Judge <jayjude@exm.com>
Date: Tue Jan 22 15:59:13 2019 +0800
Veriosn 0.2
commit 1f87773d5c23dfaf739b5eee852f75169ba3eeb7 (tag: v0.2)
Author: Jay Judge <jayjude@exm.com>
Date: Mon Jan 21 14:56:19 2019 +0800
rename README
diff --git a/README b/README.md
similarity index 100%
rename from README
rename to README.md
Git自定义
如果觉得 Git 系统的命令比较繁琐,有一个小技巧可以简化。就是给一个操作取上自定义的名字。
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
上面的例子中 ,表面只要输入 git ci 就表示 git commit,输入 git st 表示 git status等等。
如果想要使取消暂存更加快捷,同样的也可以如下设置。
$ git config --global alias.unstage 'reset HEAD --'
这样如下两条命令等价。
$ git unstage FILE.md
$ git reset HEAD -- FILE.md
总结
到这里,基本完成Git的本地操作,下一篇将学习Git的分支模型,这是Git系统的特性之一。:)。