其实使用git已经有两年多时间了,但是对Git的概念一直懵懵懂懂,平时常用的命令就那么几个,而且大部分的时候都是直接使用GitHub DeskTop客户端操作了。一直想要从头到尾梳理一下Git,网上廖雪峰的Git教程是很不错的,楼主就参照他的教程按照自己的梳理及操作,再来一遍。就啰嗦这么多,直接开始吧。
1 Git简介
Git是目前世界上最先进的分布式版本控制系统,说到这里我们必须比较一下分布式和集中式版本控制系统的区别。
- 集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。它最大的毛病集就是必须联网才能工作。
- 分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。实际使用中分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
2 Git本地库与远程库
2.1 创建本地版本库
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
fh:Desktop fenghuoMac$ mkdir learngit
fh:Desktop fenghuoMac$ cd learngit/
fh:learngit fenghuoMac$ pwd
/Users/fenghuoMac/Desktop/learngit
第二步,通过git init命令把这个目录变成Git可以管理的仓库:
fh:learngit fenghuoMac$ git init
Initialized empty Git repository in /Users/fenghuoMac/Desktop/learngit/.git/
仓库创建好后,当前目录下会多一个.git目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。这个目录一般是隐藏的,使用ls -ah可以看到。
fh:learngit fenghuoMac$ ls -ah
. .. .git
2.2 创建远程版本库
现在已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步。
登录GitHub,New repository ->输入Repository Name:learngit,其他的就按默认的来 ->create Repository
![](https://img.haomeiwen.com/i1610802/8dd33d2bdf616a43.png)
根据github的提示,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
![](https://img.haomeiwen.com/i1610802/5ecb333d2654c1ba.png)
2.3 本地仓库与远程仓库关联
2.3.1 先创建本地仓库,再关联原地仓库
楼主一般都是先在本地创建一个本地仓库,参看2.1节创建本地git仓库,然后在github创建一个远程库learngit,然后调用以下命令将本地库与远程仓库关联起来:
git remote add origin https://github.com/Lisajoy512/learn.git
git push -u origin master
第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
在此过程中,执行git push -u origin master可能会出现以下错误,错误原因在于空目录不可以提交,因此一般需要在本地仓库提交一两个文件才可以执行成功。
error:src refspec master does not match any
2.3.2 先创建远程库,然后clone到本地库
注意在github上创建时,勾选上initialize this repository with a README选项。
![](https://img.haomeiwen.com/i1610802/9b6a9664edd03c29.png)
执行clone命令,将远程库clone到本地
fh:Desktop fenghuoMac$ git clone https://github.com/Lisajoy512/learngit
Cloning into 'learngit'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
fh:Desktop fenghuoMac$ cd learngit/
fh:learngit fenghuoMac$ ls -au
. .. .git README.md
3 工作区与暂存区
3.1 工作区 working directory
工作区就是你在电脑里能看到的目录,learngit文件夹就是一个工作区:
![](https://img.haomeiwen.com/i1610802/17875b15f07deb75.png)
3.2 版本库
工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
4 文件提交
4.1 提交文件git add、git commit
fh:learngit fenghuoMac$ git add .
fh:learngit fenghuoMac$ git commit -m "first commit"
[master dc39153] first commit
1 file changed, 2 insertions(+), 1 deletion(-)
fh:learngit fenghuoMac$ git add .
fh:learngit fenghuoMac$ git commit -m "second commit"
[master cc8b902] second commit
1 file changed, 2 insertions(+), 1 deletion(-)
4.2查看仓库状态 git status
我现在learngit目录下增加一个test.txt的空文件,然后修改一下README.md。此时使用git status查看下仓库的状态。此时我们可以看到“Changes not staged for commit:modified:README.md”,“Untracked files:test.txt”
git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
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.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
test.txt
no changes added to commit (use "git add" and/or "git commit -a")
现在我们使用“git add .”提交所有的文件,然后再用git status查看仓库状态:
fh:learngit fenghuoMac$ git add .
fh:learngit fenghuoMac$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README.md
new file: test.txt
现在,暂存区的状态就变成这样了:
所以,git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit
就可以一次性把暂存区的所有修改提交到分支。现在我们队修改进行commit提交:
fh:learngit fenghuoMac$ git commit -m "third commit"
[master 7e59f25] third commit
2 files changed, 2 insertions(+), 1 deletion(-)
create mode 100644 test.txt
fh:learngit fenghuoMac$ git status
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
现在版本库变成了这样,暂存区就没有任何内容了:
接下来我们还要用实践来证明一点,git commit
只是把暂存区的文件提交到分支。我们先对README.md进行修改,然后执行git add
,然后修改test.txt文件,然后执行git commit
,最后执行git status
来查看仓库状态。我们会发现text.txt的修改并没有被提交。
fh:learngit fenghuoMac$ git add .
fh:learngit fenghuoMac$ git commit -m "forth commit"
[master 977ad71] forth commit
1 file changed, 2 insertions(+), 1 deletion(-)
fh:learngit fenghuoMac$ git status
On branch master
Your branch is ahead of 'origin/master' by 4 commits.
(use "git push" to publish your local commits)
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: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
4.3 查看工作区与版本库的区别 git diff
使用git diff
命令查看,可以看出test.txt确实没有被提交到版本库。
fh:learngit fenghuoMac$ git diff
diff --git a/test.txt b/test.txt
index e69de29..e3a9368 100644
--- a/test.txt
+++ b/test.txt
@@ -0,0 +1 @@
+#1
fh:learngit fenghuoMac$ git diff HEAD -- test.txt
diff --git a/test.txt b/test.txt
index e69de29..e3a9368 100644
--- a/test.txt
+++ b/test.txt
@@ -0,0 +1 @@
+#1
4.4 回顾提交历史git log
git log命令显示从最近到最远的提交日志。如果嫌输出信息过多,可以增加--pretty=oneline参数,其中cc8b9024a4f3789aacfdbc423ac64078d607b1a1类似的长串就是我们提交的commit id了,与SVN以递增的数字为commit id不同。
fh:learngit fenghuoMac$ git log
commit cc8b9024a4f3789aacfdbc423ac64078d607b1a1 (HEAD -> master)
Author: xxx
Date: Mon Jan 15 15:31:40 2018 +0800
second commit
commit dc39153d554fb880d37dc3a0eabb63aa0948b757
Author: xxx
Date: Mon Jan 15 15:31:04 2018 +0800
first commit
commit 43167cfad41603614ddc796032fa626aa44bbc44 (origin/master, origin/HEAD)
Author: xxx
Date: Mon Jan 15 15:20:41 2018 +0800
Initial commit
fh:learngit fenghuoMac$
fh:learngit fenghuoMac$ git log --pretty=oneline
cc8b9024a4f3789aacfdbc423ac64078d607b1a1 (HEAD -> master) second commit
dc39153d554fb880d37dc3a0eabb63aa0948b757 first commit
43167cfad41603614ddc796032fa626aa44bbc44 (origin/master, origin/HEAD) Initial commit
4.5 git reflog
那如果已经关闭了命令行,无从知道“second commit”的commit id怎么办。放心,Git提供了一个命令git reflog用来记录你的每一次命令。可以从命令的历史中得知head现在指向了哪个commit id。
fh:learngit fenghuoMac$ git reflog
cc8b902 (HEAD -> master) HEAD@{0}: reset: moving to cc8b9024a4f3789aacfdbc423ac64078d607b1a1
dc39153 HEAD@{1}: reset: moving to head^
cc8b902 (HEAD -> master) HEAD@{2}: commit: second commit
dc39153 HEAD@{3}: commit: first commit
43167cf (origin/master, origin/HEAD) HEAD@{4}: clone: from https://github.com/Lisajoy512/learngit
5 分支管理
5.1 分支管理常用命令
查看本地分支:$ git branch
查看远程分支:$ git branch -r
创建本地分支:$ git branch [name] ----注意新分支创建后不会自动切换为当前分支
切换分支:$ git checkout [name]
创建新分支并立即切换到新分支:$ git checkout -b [name]
删除分支:$ git branch -d [name] ---- -d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项
合并分支:$ git merge [name] ----将名称为[name]的分支与当前分支合并
创建远程分支(本地分支push到远程):$ git push origin [name]
删除远程分支:$ git push origin :heads/[name] 或 $ gitpush origin :[name]
检出仓库: $ git clone git://github.com/jquery/jquery.git
查看远程仓库:$ git remote -v
添加远程仓库:$ git remote add [name] [url]
删除远程仓库:$ git remote rm [name]
修改远程仓库:$ git remote set-url --push [name] [newUrl]
拉取远程仓库:$ git pull [remoteName] [localBranchName]
推送远程仓库:$ git push [remoteName] [localBranchName]
如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,如下:
$git push origin test:master // 提交本地test分支作为远程的master分支
$git push origin test:test // 提交本地test分支作为远程的test分支
5.2 分支策略
在分支管理策略里,我们常用到的有三种分支:master分支、dev分支、bug分支。
master分支:master主分支应该是非常稳定的,也就是用来发布新版本,一般情况下不允许在上面干活。可以在要发布,或者说dev分支代码稳定后可以合并到主分支master上来。
dev分支:每个开发可各自拥有自己的dev分支,平时各自的开发工作都在dev分支上进行。
bug分支:为了修复bug临时拉出来的分支。
现在我们着重讲一下bug分支。假设现在有一个场景,在dev分支开发中时接到一个修复bug的任务。但是在dev分支上的任务开发到一半,目前还无法提交,此时可以采用保留现场功能。
比如我们修改一下README.md,然后git status
查看仓库状态会有一条modified提示,然后git stash
保留工作现场,最后使用git status
查看工作区就是clean的了。
fh:learngit fenghuoMac$ git status
On branch master
Your branch is up-to-date with 'origin/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.md
no changes added to commit (use "git add" and/or "git commit -a")
fh:learngit fenghuoMac$ git stash
Saved working directory and index state WIP on master: 4fbda2f sixth commit
fh:learngit fenghuoMac$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
修改完bug后将代码合并到master分支后,我们现在要重新切回dev分支继续干活,git stash list
查看工作现场,git stash apply
恢复现场。
fh:learngit fenghuoMac$ git checkout wye
Switched to branch 'wye'
fh:learngit fenghuoMac$ git stash list
stash@{0}: WIP on master: 4fbda2f sixth commit
fh:learngit fenghuoMac$
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
fh:learngit fenghuoMac$ git stash list
stash@{0}: WIP on master: 4fbda2f sixth commit
关于git stash不讲太多,还有两个相关的命令在这里也捎带列一下:
git stash drop:git stash apply恢复,恢复后,stash内容并不删除,你需要使用git stash drop
命令来删除。
git stash pop:恢复的同时把stash内容也删除了。
5.3 分支合并
一开始的时候,master
分支是一条线,Git用master
指向最新的提交,再用HEAD
指向master
,就能确定当前分支,以及当前分支的提交点:
每次提交,master
分支都会向前移动一步,这样,随着你不断提交,master
分支的线也越来越长。
当我们创建新的分支,例如dev
时,Git新建了一个指针叫dev
,指向master
相同的提交,再把HEAD
指向dev
,就表示当前分支在dev
上:
你看,Git创建一个分支很快,因为除了增加一个dev
指针,改改HEAD
的指向,工作区的文件都没有任何变化!
不过,从现在开始,对工作区的修改和提交就是针对dev
分支了,比如新提交一次后,dev
指针往前移动一步,而master
指针不变:
5.3.1 git merge
5.3.1.1 Fast-forward模式
假如我们在dev
上的工作完成了,就可以把dev
合并到master
上。Git怎么合并呢?最简单的方法,就是直接把master
指向dev
的当前提交,就完成了合并。
这种最简单的合并方式我们称为Fast forward模式,在命令行里可以看到git给我们的“Fast-forward”的提示:
fh:learngit fenghuoMac$ git merge wye
Updating 3ff16c8..75941ab
Fast-forward
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
5.3.1.2 --no-ff模式
使用Fast forward模式,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
fh:learngit fenghuoMac$ git merge --no-ff wye
Merge made by the 'recursive' strategy.
README.md | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
不使用Fast forward
模式,merge后就像这样:
5.3.2 git rebase
merge和rebase命令都是合并目标分支到当前分支的,但区别是rebase命令执行后,实际上是将分支点从C移到了G,这样分支也就具有了从C到G的功能
![](https://img.haomeiwen.com/i1610802/9ce975933154cf7f.png)
6 文件撤销
6.1 撤销工作区的修改git checkout -- file
我们现在编辑一下README.md,然后使用git status
查看下仓库状态,然后git checkout -- README.md
撤销修改,最后再使用git status
查看一下状态,会发现README.md已经还原到修改之前了。
fh:learngit fenghuoMac$ git status
On branch master
Your branch is ahead of 'origin/master' by 4 commits.
(use "git push" to publish your local commits)
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.md
no changes added to commit (use "git add" and/or "git commit -a")
fh:learngit fenghuoMac$ git checkout -- README.md
fh:learngit fenghuoMac$ git status
On branch master
Your branch is ahead of 'origin/master' by 4 commits.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
现在我们调整下步骤,我们现在编辑一下README.md(现在文件的最后一行内容是#5),然后git add
提交到暂存区,然后使用git status
查看下仓库状态,然后git checkout -- README.md
撤销修改,最后再使用cat
查看一下文件内容:
fh:learngit fenghuoMac$ git add .
fh:learngit fenghuoMac$ git status
On branch master
Your branch is ahead of 'origin/master' by 4 commits.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README.md
fh:learngit fenghuoMac$ cat README.md
# learngit
#1
#2
#3
#4
#5
现在我们继续编辑修改README.md(现在文件内容最后一行是#6),然后git checkout -- README.md
撤销修改,最后再使用cat
查看一下文件内容:
fh:learngit fenghuoMac$ cat README.md
# learngit
#1
#2
#3
#4
#5
#6
fh:learngit fenghuoMac$ git checkout -- README.md
fh:learngit fenghuoMac$ cat README.md
# learngit
#1
#2
#3
#4
#5
命令git checkout -- README.md意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
- 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。git checkout -- file命令中的--很重要,没有--,就变成了切换分支的命令了。
6.2 撤销暂存区的修改 git reset
现在我们修改README.md,且将其add到暂存区,但是我们想撤销README.md的修改返回到工作区怎么操作呢?在add之后我们可以使用git reset HEAD README.md
命令把暂存区的修改撤销掉(unstage),重新放回工作区。这里的HEAD
表示的便是最新的版本,HEAD
你也可以自己替换为其他的commit ID表示要回退到哪一次版本。
fh:learngit fenghuoMac$ git add .
fh:learngit fenghuoMac$ git status
On branch master
Your branch is ahead of 'origin/master' by 5 commits.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README.md
fh:learngit fenghuoMac$ git reset HEAD README.md
Unstaged changes after reset:
M README.md
fh:learngit fenghuoMac$ git status
On branch master
Your branch is ahead of 'origin/master' by 5 commits.
(use "git push" to publish your local commits)
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.md
no changes added to commit (use "git add" and/or "git commit -a")
6.3 删除文件 git rm
我们想要删除test.txt
,可能我们会直接执行rm test.txt
(此时表示只是在工作区删除)命令,然后执行git add test.txt
,最后执行git commit -m "delete test.txt"
,才能真正将删除提交到版本库。
git提供了git rm
命令,执行git rm test.txt
相当于先在工作区删除然后提交到暂存区。最后执行最后执行git commit -m "delete test.txt"
将删除真正提交到版本库。
在研读廖雪峰老师的使用git checkout -- test.txt
撤回删除时我实践时遇到了这样的问题
fh:learngit fenghuoMac$ git rm test.txt
rm 'test.txt'
fh:learngit fenghuoMac$ git status
On branch master
Your branch is ahead of 'origin/master' by 6 commits.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: test.txt
fh:learngit fenghuoMac$ git checkout -- test.txt
error: pathspec 'test.txt' did not match any file(s) known to git.
注意这里的报错原因是:工作区(已删除test.txt)与add后的缓存区(git add test.txt 所以也删除了test.txt)比较了文件,都是没有test.txt文件,没有差异,提示没有匹配到文件(英文错误提示)。此时必须用git checkout HEAD test.txt
或者git reset
命令来恢复误删的文件了。
而如果单纯使用rm命令删除了test.txt文件,则可以使用git checkout -- test.txt
恢复。git checkout其实是用版本库里的版本替换工作区的版本。
fh:learngit fenghuoMac$ rm test.txt
fh:learngit fenghuoMac$ git checkout -- test.txt
7 版本回退
7.1 git reset
根据6.2节我们知道git reset
命令可以暂存区的修改回退到工作区,现在我们要讲的是回退版本。
在Git中,用HEAD表示当前版本,也就是最新的提交cc8b9024a4f3789aacfdbc423ac64078d607b1a1,上一个版本就是HEAD^ ,上上一个版本就是HEAD^^ ,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
回退到过去某个版本
比如我要回退到上一个版本:
fh:learngit fenghuoMac$ git reset --hard head^
HEAD is now at dc39153 first commit
fh:learngit fenghuoMac$ git log --pretty=oneline
dc39153d554fb880d37dc3a0eabb63aa0948b757 (HEAD -> master) first commit
43167cfad41603614ddc796032fa626aa44bbc44 (origin/master, origin/HEAD) Initial commit
回退到某个未来的版本
比如我们已回退到“first commit”的版本,但现在后悔了想回到“second commit”版本,只要命令行窗口没关闭我们知道“second commit”的commit id(一般写commit id头几位便可以,git会自动寻找)便可以回退:
fh:learngit fenghuoMac$ git reset --hard cc8b9024a4f3789aacfdbc423ac64078d607b1a1
HEAD is now at cc8b902 second commit
fh:learngit fenghuoMac$ git log --pretty=oneline
cc8b9024a4f3789aacfdbc423ac64078d607b1a1 (HEAD -> master) second commit
dc39153d554fb880d37dc3a0eabb63aa0948b757 first commit
43167cfad41603614ddc796032fa626aa44bbc44 (origin/master, origin/HEAD) Initial commit
git里面回退是非常高效的,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD指向你要回退的那个版本了。
reset参数详解:
--soft – 缓存区和工作目录都不会被改变
--mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响
--hard – 缓存区和工作目录都同步到你指定的提交
这些标记往往和HEAD作为参数一起使用。比如:
git reset --mixed HEAD 将你当前的改动从缓存区中移除,但是这些改动还留在工作目录中。
另一方面,如果你想完全舍弃你没有提交的改动,你可以使用git reset --hard HEAD。这是git reset最常用的两种用法。
7.2 git revert
Revert撤销一个提交的同时会创建一个新的提交。这是一个安全的方法,因为它不会重写提交历史。比如,下面的命令会找出倒数第二个提交,然后创建一个新的提交来撤销这些更改,然后把这个提交加入项目中。
相比git reset,它不会改变现在的提交历史。因此,git revert可以用在公共分支上,git reset应该用在私有分支上。
你也可以把git revert当作撤销已经提交的更改,而git reset HEAD用来撤销没有提交的更改。
然后我们可以通过git revert --abort来取消这次revert。
就像git checkout 一样,git revert 也有可能会重写文件。所以,Git会在你执行revert之前要求你提交或者缓存你工作目录中的更改。
8 标签管理
git中的标签相关的功能非常简单,这里就不赘述了。常用命令有:
查看版本:$ git tag
创建版本:$ git tag [name]
删除版本:$ git tag -d [name]
查看远程版本:$ git tag -r
创建远程版本(本地版本push到远程):$ git push origin [name]
删除远程版本:$ git push origin :refs/tags/[name]
合并远程仓库的tag到本地:$ git pull origin --tags
上传本地tag到远程仓库:$ git push origin --tags
创建带注释的tag:$ git tag -a [name] -m 'yourMessage'
列举一个工作可能遇到的小意外,假如本应在上周五打tag时忘记了,现在已经是下周一了,怎么办?很简单,找到上周五提交的commit id,然后在这次的commit id上打tag。
git tag v0.9 6224937
9 忽略文件
有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不爽。
这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
忽略文件这个比较简单,就提示一下楼主遇到的坑,比如我在.gitignore里添加了README.md文件,然后修改README.md文件再add发现依然可以提交,这种情况是因为新建的文件在git中会有缓存,如果某些文件已经被纳入了版本管理中,就算是在.gitignore中已经声明了忽略路径也是不起作用的,这时候我们就应该先把本地缓存删除,然后再进行git的push,这样就不会出现忽略的文件了。git清除本地缓存命令如下:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
10 参考文章:
廖雪峰的Git教程
Git简介及常用命令
Git使用详细教程
代码回滚:git reset、git checkout和git revert区别和联系
Git的奇技淫巧🙈
Learn Git Branching
网友评论