玩转Git

作者: Claire_wu | 来源:发表于2018-01-17 16:20 被阅读51次

其实使用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


image.png

根据github的提示,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。


image.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选项。


image.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文件夹就是一个工作区:


image.png

3.2 版本库

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

git-repo

我们把文件往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-stage-after-commit

接下来我们还要用实践来证明一点,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,就能确定当前分支,以及当前分支的提交点:

git-br-initial

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

git-br-create

你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

git-br-dev-fd

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(-)
git-br-ff-merge

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后就像这样:

git-no-ff-mode

5.3.2 git rebase

merge和rebase命令都是合并目标分支到当前分支的,但区别是rebase命令执行后,实际上是将分支点从C移到了G,这样分支也就具有了从C到G的功能

image

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

相关文章

  • [Git 入门教程] 手把手教你玩转 Git/GitHub

    [Git 入门教程] 手把手教你玩转 Git/GitHub by Grit, 4/23/2019 导语:写这个教程...

  • 玩转Git

    其实使用git已经有两年多时间了,但是对Git的概念一直懵懵懂懂,平时常用的命令就那么几个,而且大部分的时候都是直...

  • Git

    玩转Git三剑客 学习笔记 配置 user 信息 显示 config 的配置,加 --list 建 git 仓库 ...

  • 一文带你玩转Git

    一文带你玩转Git Git基本操作 git的常见基本操作游走于远程仓库、本地仓库、暂存区、工作区.需要使用pull...

  • Git 学习笔记 1

    参考:极客时间 玩转Git三剑客 1. Git 1.1 初始化 username email 保证变更信息能够溯源...

  • 版本控制

    在开发中 git 是最常用的版本控制软件,在学习极客时间苏玲的《玩转 git 三剑客》前,对 git 的使用只停留...

  • 玩转Git(一)

    一、Git综述 1、VCS出现前的状况 用目录拷贝区别不同版本 公共文件容易被覆盖 成员沟通成本很高,代码集成效率...

  • 玩转Git(三)

    SSH keys An SSH key allows you to establish a secure conn...

  • 玩转Git(二)

    一、Git配置 1./etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git conf...

  • 书签

    vczh-git vczh-blog 每天5分钟玩转ope Nginx开发入门到精通 500行代码:http://...

网友评论

    本文标题:玩转Git

    本文链接:https://www.haomeiwen.com/subject/axdznxtx.html