簡(jiǎn)介
- Git是一個(gè)開源的分布式版本控制系統(tǒng),用于敏捷高效地處理任何或小或大的項(xiàng)目询件。
- Git 與常用的版本控制工具 CVS, SVN 等不同,它采用了分布式版本庫(kù)的方式,不必服務(wù)器端軟件支持痕钢。
SVN 區(qū)別點(diǎn)
- GIT是分布式的,SVN不是序六,這是GIT和其它非分布式的版本控制系統(tǒng)任连,例如SVN,CVS等例诀,最核心的區(qū)別随抠。
- GIT把內(nèi)容按元數(shù)據(jù)方式存儲(chǔ),而SVN是按文件:所有的資源控制系統(tǒng)都是把文件的元信息隱藏在一個(gè)類似.svn,.cvs等的文件夾里繁涂。即GIT管理的是修改拱她,而SVN管理的是文件。
- GIT分支和SVN的分支不同:分支在SVN中一點(diǎn)不特別扔罪,就是版本庫(kù)中的另外的一個(gè)目錄秉沼。
- GIT沒有一個(gè)全局的版本號(hào),而SVN有:目前為止這是跟SVN相比GIT缺少的最大的一個(gè)特征。
- GIT的內(nèi)容完整性要優(yōu)于SVN:GIT的內(nèi)容存儲(chǔ)使用的是SHA-1哈希算法氧猬。這能確保代碼內(nèi)容的完整性背犯,確保在遇到磁盤故障和網(wǎng)絡(luò)問題時(shí)降低對(duì)版本庫(kù)的破壞。
配置
Git 提供了一個(gè)叫做 git config 的工具盅抚,專門用來配置或讀取相應(yīng)的工作環(huán)境變量漠魏。
三種不同級(jí)別的配置
- git config --system
????系統(tǒng)用戶級(jí)別所擁有的倉(cāng)庫(kù)配置值,基本不用到 - git config --global
????全局的倉(cāng)庫(kù)配置值妄均,會(huì)去讀寫每個(gè)用戶下的~/.gitconfig文件 - git config --local
????局部的倉(cāng)庫(kù)配置值柱锹,會(huì)去讀寫某個(gè)項(xiàng)目下的.git/config文件
設(shè)置用戶信息
????設(shè)置用戶名和郵箱,配置的用戶名和郵件地址將在版本庫(kù)提交時(shí)作為提交者的用戶名和郵件地址丰包。
git config --global user.name "hyn"
git config --global user.email "example@qq.com"
????如果用 --global選項(xiàng)禁熏,那么更改的配置文件就是位于你用戶主目錄下的那個(gè)配置,以后你所有的項(xiàng)目都會(huì)默認(rèn)使用這里配置的用戶信息邑彪。
????如果要在某個(gè)特定的項(xiàng)目中使用其他名字或者郵箱瞧毙,只要在對(duì)應(yīng)的項(xiàng)目目錄下去掉--global選項(xiàng)重新配置或者在對(duì)應(yīng)的項(xiàng)目目錄下把--global 換成--local即可,新的設(shè)定保存在當(dāng)前項(xiàng)目的 .git/config 文件里寄症。
設(shè)置別名
????可通過alias去修改git命令的別名
-
git status
是用來查看文件修改的命令宙彪,可以用git st 代替 -
git pull
是用來拉取遠(yuǎn)程倉(cāng)庫(kù)代碼的命令,可以用git pl 代替 -
git push
是用來將本地修改推送到遠(yuǎn)程倉(cāng)庫(kù)的命令有巧,可以用git ps 代替
git config --global alias.st status
git config --global alias.pl pull
git config --global alias.ps push
查看配置信息
????查看整個(gè)配置信息:git config --local --list
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true
user.name=hyn
user.email=example@163.com
alias.ps=push
????查找某個(gè)變量的設(shè)置:git config --local user.name
hyn
工作區(qū)释漆、暫存區(qū)和版本庫(kù)
基本概念
工作區(qū):你電腦里項(xiàng)目的目錄。
暫存區(qū):英文叫stage,一般存放在”git目錄”下的index文件(.git/index)中篮迎,所以我們把暫存區(qū)有時(shí)也叫作索引(index)男图。
-
版本庫(kù):工作區(qū)有一個(gè)隱藏目錄.git,這個(gè)不算工作區(qū)甜橱,而是Git的版本庫(kù)逊笆。
工作區(qū)、暫存區(qū)和版本庫(kù)之間的關(guān)系.png 圖中左側(cè)為工作區(qū)岂傲,右側(cè)為版本庫(kù)览露。在版本庫(kù)中標(biāo)記為 stage的區(qū)域是暫存區(qū),標(biāo)記為master的是項(xiàng)目的master分支譬胎。
圖中我們可以看出此時(shí)HEAD實(shí)際是指向 master 分支的一個(gè)游標(biāo)。所以圖示的命令中出現(xiàn) HEAD 的地方可以用 master 來替換命锄。
當(dāng)對(duì)工作區(qū)修改的文件執(zhí)行
git add
命令時(shí)堰乔,暫存區(qū)的目錄樹被更新即把工作區(qū)的修改添加到暫存區(qū);當(dāng)執(zhí)行提交操作git commit
時(shí)脐恩,暫存區(qū)的目錄樹寫到版本庫(kù)中镐侯,master 分支會(huì)做相應(yīng)的更新。即把暫存區(qū)的內(nèi)容提交到當(dāng)前分支當(dāng)執(zhí)行
git reset HEAD
命令時(shí),暫存區(qū)的目錄樹會(huì)被重寫苟翻,被 master 分支指向的目錄樹所替換韵卤,但是工作區(qū)不受影響。當(dāng)執(zhí)行
git rm --cached <file>
命令時(shí)崇猫,會(huì)直接從暫存區(qū)刪除文件沈条,工作區(qū)則不做出改變。當(dāng)執(zhí)行
git checkout .
或者git checkout -- <file>
命令時(shí)诅炉,會(huì)用暫存區(qū)全部或指定的文件替換工作區(qū)的文件蜡歹。這個(gè)操作很危險(xiǎn),會(huì)清除工作區(qū)中未添加到暫存區(qū)的改動(dòng)涕烧。當(dāng)執(zhí)行
git checkout HEAD .
或者git checkout HEAD <file>
命令時(shí)月而,會(huì)用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區(qū)和以及工作區(qū)中的文件。這個(gè)命令也是極具危險(xiǎn)性的议纯,因?yàn)椴坏珪?huì)清除工作區(qū)中未提交的改動(dòng)父款,也會(huì)清除暫存區(qū)中未提交的改動(dòng)。
版本庫(kù)
????版本庫(kù)又名倉(cāng)庫(kù)瞻凤,英文名repository憨攒,可以簡(jiǎn)單理解成一個(gè)目錄,這個(gè)目錄里面的所有文件都可以被Git管理起來鲫构,每個(gè)文件的修改浓恶、刪除,Git都能跟蹤结笨,以便任何時(shí)刻都可以追蹤歷史包晰,或者在將來某個(gè)時(shí)刻可以“還原”。
新建本地倉(cāng)庫(kù)
????使用 git init
命令來初始化一個(gè) Git 倉(cāng)庫(kù)炕吸, 在執(zhí)行完成 git init 命令后伐憾,Git 倉(cāng)庫(kù)會(huì)生成一個(gè) .git 目錄,該目錄包含了資源的所有元數(shù)據(jù)赫模,其他的項(xiàng)目目錄保持不變树肃。
- 使用當(dāng)前目錄作為倉(cāng)庫(kù):
git init
- 使用執(zhí)行目錄作為倉(cāng)庫(kù):
git init 目錄地址
復(fù)制遠(yuǎn)程倉(cāng)庫(kù)
????使用 git clone
從現(xiàn)有的遠(yuǎn)程倉(cāng)庫(kù)中拷貝項(xiàng)目
- 當(dāng)前目錄下拷貝:
git clone 倉(cāng)庫(kù)地址
- 拷貝到指定目錄:
git clone 倉(cāng)庫(kù)地址 目錄地址
基本操作
git init
????創(chuàng)建一個(gè)空的Git存儲(chǔ)庫(kù)或重新初始化一個(gè)現(xiàn)有的存儲(chǔ)庫(kù)。
- 摘要
git init [-q | --quiet] [--bare] [--template=<template_directory>]
[--separate-git-dir <git dir>]
[--shared[=<permissions>]] [directory]
- 描述
????此命令創(chuàng)建一個(gè)空的Git存儲(chǔ)庫(kù)瀑罗,會(huì)在當(dāng)前目錄下生成一個(gè).git目錄胸嘴,該目錄下包含objects, refs/heads, refs/tags和模版文件。該命令還創(chuàng)建了一個(gè)master分支斩祭,以及指向master的一個(gè)指針叫HEAD劣像。 - 示例
$ mkdir demo
$ cd demo
$ git init
Initialized empty Git repository in /Users/huangyangneng/Documents/workspace/git/demo/.git/
在demo目錄下創(chuàng)建了一個(gè)空的git倉(cāng)庫(kù)
$ ls -a
. .. .git
git clone
????克隆一個(gè)遠(yuǎn)程倉(cāng)庫(kù)到本地目錄。
- 概要
git clone [--template=<template_directory>]
[-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror]
[-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>]
[--dissociate] [--separate-git-dir <git dir>]
[--depth <depth>] [--[no-]single-branch] [--no-tags]
[--recurse-submodules[=<pathspec>]] [--[no-]shallow-submodules]
[--jobs <n>] [--] <repository> [<directory>]
- 描述
????克隆遠(yuǎn)程倉(cāng)庫(kù)到當(dāng)前目錄摧玫,并為克隆下來的本地倉(cāng)庫(kù)的每個(gè)分支創(chuàng)建遠(yuǎn)程跟蹤分支(可使用git branch -r
查看)耳奕,并從克隆檢出的存儲(chǔ)庫(kù)作為當(dāng)前活動(dòng)分支的初始分支。
????在克隆之后,沒有參數(shù)的普通git提取將更新所有遠(yuǎn)程跟蹤分支屋群,并且沒有參數(shù)的git pull將會(huì)把遠(yuǎn)程主分支合并到當(dāng)前主分支(如果有的話)闸婴。 - 示例
$ git clone https://github.com/huangyangneng/demo.git
Cloning into 'demo'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.
克隆完后,會(huì)在當(dāng)前目錄下生成一個(gè)demo文件夾芍躏。進(jìn)入demo文件夾邪乍,可以看到有一個(gè).git目錄。
git add
????將修改過的文件添加到緩存區(qū)中
- 摘要
git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]
[--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]]
[--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--renormalize]
[--chmod=(+|-)x] [--] [<pathspec>…?]
- 描述
????此命令將修改過的文件添加到到暫存區(qū)纸肉,作為下一次準(zhǔn)備提交的內(nèi)容溺欧。 它通常將現(xiàn)有路徑下的當(dāng)前修改內(nèi)容作為一個(gè)整體添加,但是通過一些選項(xiàng)柏肪,它也可以用于添加只對(duì)文件進(jìn)行一些更改姐刁,或刪除。
????暫存區(qū)保存著當(dāng)前修改內(nèi)容的快照烦味,并且將該快照作為下一個(gè)提交的內(nèi)容聂使。 因此,在對(duì)倉(cāng)庫(kù)進(jìn)行任何更改之后谬俄,并且在運(yùn)行git commit
命令之前柏靶,必須使用git add
命令將任何新的或修改的文件添加到暫存區(qū)中。
????該命令可以在提交之前多次執(zhí)行溃论。它只在運(yùn)行git add
命令時(shí)添加指定修改的內(nèi)容; 如果希望隨后的更改包含在下一個(gè)提交中屎蜓,那么必須再次運(yùn)行git add
將新的內(nèi)容添加到暫存區(qū)中。
????默認(rèn)情況下钥勋,git add
命令不會(huì)添加忽略的文件炬转。 如果在命令行上顯式指定了任何忽略的文件,git add
命令都將失敗算灸,并顯示一個(gè)忽略的文件列表扼劈。由Git執(zhí)行的目錄遞歸或文件名遍歷所導(dǎo)致的忽略文件將被默認(rèn)忽略。git add
命令可以用-f(force)選項(xiàng)添加被忽略的文件菲驴。 - 示例
$ touch README.md
$ echo hello world > README.md
$ git add -A
git add -u [<path>]:把<path>中所有跟蹤文件中被修改過或已刪除文件的信息添加到暫存區(qū)荐吵。它不會(huì)處理那些不被跟蹤的文件。省略<path>表示 . ,即當(dāng)前目錄赊瞬。
git add -A <path>:表示把中所有跟蹤文件中被修改過或已刪除文件和所有未跟蹤的文件信息添加到暫存區(qū)中先煎。省略<path>表示 . ,即當(dāng)前目錄。
git status
????查看當(dāng)前倉(cāng)庫(kù)的狀態(tài)
- 摘要
git status [<options>…?] [--] [<pathspec>…?]
- 概述
????顯示倉(cāng)庫(kù)中未被git commit
過的所有文件狀態(tài)信息巧涧,包括被追蹤文件的修改榨婆、刪除和新建未執(zhí)行git add
的未被追蹤的文件。
- 示例
????在每次執(zhí)行git commit
之前先使用git status檢查文件狀態(tài)是一個(gè)很好的習(xí)慣, 這樣能防止你不小心提交了您不想提交的東西褒侧。
????通過git status -uno
可以只列出所有已經(jīng)被git管理的且被修改但沒提交的文件。
????通過git status -s
以獲得簡(jiǎn)短的結(jié)果輸出,如果沒加該參數(shù)會(huì)詳細(xì)輸出內(nèi)容.
$ git status
On branch master
Initial commit
Changes to be committed: (已經(jīng)在stage區(qū), 等待添加到HEAD中的文件)
(use "git rm --cached <file>..." to unstage)
new file: README.md
new file: test.txt
Changes not staged for commit:(有修改, 但是沒有被添加到stage區(qū)的文件)
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: test.txt
Untracked files:(沒有tracked過的文件, 即從沒有add過的文件)
(use "git add <file>..." to include in what will be committed)
hello.txt
git diff
????用來顯示已寫入緩存與已修改但尚未寫入緩存的改動(dòng)的區(qū)別。此命令比較的是工作目錄中當(dāng)前文件和暫存區(qū)域快照之間的差異,也就是修改之后還沒有暫存起來的變化內(nèi)容闷供。
- 摘要
git diff [options] [<commit>] [--] [<path>…?]
git diff [options] --cached [<commit>] [--] [<path>…?]
git diff [options] <commit> <commit> [--] [<path>…?]
git diff [options] <blob> <blob>
git diff [options] [--no-index] [--] <path> <path>
- 概述
????顯示工作樹和索引或樹之間的變化烟央,索引和樹之間的變化,兩棵樹之間的變化歪脏,兩個(gè)blob對(duì)象之間的變化疑俭,或者磁盤上兩個(gè)文件之間的變化。
- 示例
- 比較工作區(qū)和暫存區(qū)域之間的差異也就是修改之后還沒有暫存起來的變化內(nèi)容:git diff
- 比較當(dāng)前文件和暫存區(qū)文件差異:
git diff <file>
- 比較兩次提交之間的差異:
git diff id1 id2
- 在兩個(gè)分支之間比較:
git diff branch1 branch2
- 比較暫存區(qū)和版本庫(kù)差異:
git diff --staged
- 查看已緩存的改動(dòng):
git diff --cached
- 查看已緩存的與未緩存的所有改動(dòng):
git diff HEAD
- 僅僅比較統(tǒng)計(jì)信息:
git diff --stat
# 比較工作區(qū)和暫存區(qū)域之間的差異
$ git diff
diff --git a/hello.txt b/hello.txt
index ce01362..b1d9f39 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1,2 @@
hello
+git diff
# 比較當(dāng)前文件和暫存區(qū)文件差異
$ git diff test.txt
diff --git a/test.txt b/test.txt
index ed894ce..3b68ed8 100644
--- a/test.txt
+++ b/test.txt
@@ -1,2 +1,3 @@
test
dte
+git diff test
# 比較兩次提交之間的差異
$ git diff 7e7c298660207f30568dcd5efc127392988916e1 fb89408bc73a5ebaa8fa0536ddadda7a92b07f0f
diff --git a/test.txt b/test.txt
index ed894ce..9daeafb 100644
--- a/test.txt
+++ b/test.txt
@@ -1,2 +1 @@
test
-dte
# 查看已緩存的與未緩存的所有改動(dòng)
$ git diff HEAD
diff --git a/hello.txt b/hello.txt
new file mode 100644
index 0000000..b1d9f39
--- /dev/null
+++ b/hello.txt
@@ -0,0 +1,2 @@
+hello
+git diff
diff --git a/test.txt b/test.txt
index ed894ce..3b68ed8 100644
--- a/test.txt
+++ b/test.txt
@@ -1,2 +1,3 @@
test
dte
+git diff testg
# 比較統(tǒng)計(jì)信息
$ git diff --stat
hello.txt | 1 +
test.txt | 1 +
2 files changed, 2 insertions(+)
git commit
????將緩存區(qū)內(nèi)容添加到倉(cāng)庫(kù)中
- 摘要
git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]
[--dry-run] [(-c | -C | --fixup | --squash) <commit>]
[-F <file> | -m <msg>] [--reset-author] [--allow-empty]
[--allow-empty-message] [--no-verify] [-e] [--author=<author>]
[--date=<date>] [--cleanup=<mode>] [--[no-]status]
[-i | -o] [-S[<keyid>]] [--] [<file>…?]
- 概述
????git commit
命令將暫存區(qū)的當(dāng)前內(nèi)容與描述更改的用戶和日志消息一起存儲(chǔ)在新的提交中婿失。
要添加的內(nèi)容可以通過以下幾種方式指定:
在使用
git commit
命令之前钞艇,通過使用git add
將工作區(qū)的內(nèi)容添加到暫存區(qū);通過使用帶有
-a
選項(xiàng)的git commit
命令來添加從所有已知文件(即所有已經(jīng)在暫存區(qū)中列出的文件)豪硅,并自動(dòng)從工作樹中刪除執(zhí)行過“git rm
”的文件;通過使用
git rm
從工作樹和暫存區(qū)中刪除文件哩照,再次使用git commit
命令;通過將文件作為參數(shù)列出到
git commit
命令(不使用--interactive
或--patch
選項(xiàng)),在這種情況下懒浮,提交將忽略暫存區(qū)中分段的更改飘弧,而是記錄列出的文件的當(dāng)前內(nèi)容;通過使用
--interactive
或--patch
選項(xiàng)與git commit
命令一起確定除了暫存區(qū)中的內(nèi)容之外哪些文件應(yīng)該是提交的一部分,然后才能完成操作砚著。示例
$ vi commit.xt #添加文件次伶,文件內(nèi)容為commit
$ git status #查看當(dāng)前狀態(tài)
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
Untracked files:
(use "git add <file>..." to include in what will be committed)
commit.txt
nothing added to commit but untracked files present (use "git add" to track)
$ git add commit.txt #提交到暫存區(qū)
$ git status #查看當(dāng)前狀態(tài)
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: commit.txt
$ git commit -m "add commit.txt" #提交修改
[master deb9eb3] add commit.txt
1 file changed, 1 insertion(+)
create mode 100644 commit.txt
$ git status #查看當(dāng)前狀態(tài)
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
nothing to commit, working directory clean
$ git log #查看提交記錄
commit deb9eb3cd2ec92b12417b8d20db884db7d4a7711
Author: huangyangneng <test@qq.com>
Date: Sat May 26 11:10:21 2018 +0800
add commit.txt
git log
????查看歷史提交記錄
- 摘要
git log [<options>] [<revision range>] [[\--] <path>…?]
- 概述
????該命令采用適用于git rev-list
命令的選項(xiàng)來控制顯示的內(nèi)容以及適用于git diff- *
命令的選項(xiàng)來控制每個(gè)提交的更改是如何顯示的。
- 示例
- 顯示提交歷史:
git log
- 查看歷史記錄的簡(jiǎn)潔的版本:
git log --oneline
- 查看所有未被合并過的提交信息:
git log --no-merges
- 查看所有合并過的提交歷史記錄:
git log --merges
- 查看歷史中什么時(shí)候出現(xiàn)了分支稽穆、合并:
git log g--oneline --graph
- 逆向顯示所有日志:
git log --reverse --oneline
- 查找指定用戶的提交日志:
git log --author=huangyangneng --oneline
- 顯示最近幾次的提交:
git log -3
- 顯示某次提交以及之前的記錄:
git log commitId
- 顯示指定時(shí)間之后的提交(不包含當(dāng)前日期
--since冠王,--affter
):git log --oneline --after={2018-04-18}
- 顯示指定時(shí)間之前的提交(包含當(dāng)前日期--until,--before):
git log --oneline --before={1.day.ago}
- 顯示提交歷史:
$ git log
commit deb9eb3cd2ec92b12417b8d20db884db7d4a7711
Author: huangyangneng <test@qq.com>
Date: Sat May 26 11:10:21 2018 +0800
add commit.txt
commit cebe2945e0262aace6df11f02e3d96156807a12e
Author: huangyangneng <test@qq.com>
Date: Sat May 26 11:09:19 2018 +0800
add diff.txt
commit bbe2af51886d10268c7faabbaeff5b87634cc5cd
Author: huangyangneng <test@qq.com>
Date: Sat May 26 11:00:19 2018 +0800
test
commit 6237009b04e1a4cb35bc4fa726834826035ea581
Author: huangyangneng <test@qq.com>
Date: Sat May 26 10:59:31 2018 +0800
commit
commit 78ea960945cb7e5ed7c38e4129f6f3fa59a365f8
Author: huangyangneng <test@qq.com>
Date: Sat May 26 10:58:35 2018 +0800
git commit test
commit 7e7c298660207f30568dcd5efc127392988916e1
Author: huangyangneng <test@qq.com>
Date: Sat May 26 10:14:43 2018 +0800
test
commit fb89408bc73a5ebaa8fa0536ddadda7a92b07f0f
Author: huangyangneng <test@qq.com>
Date: Sat May 26 10:14:16 2018 +0800
test
$ git log --oneline #查看歷史記錄的簡(jiǎn)潔的版本
deb9eb3 add commit.txt
cebe294 add diff.txt
bbe2af5 test
6237009 commit
78ea960 git commit test
7e7c298 test
fb89408 test
$ git log --oneline -3 #顯示最近3次的提交
deb9eb3 add commit.txt
cebe294 add diff.txt
bbe2af5 test
$ git log --oneline --before={2018-05-26} #顯示2018-05-26之前的提交
deb9eb3 add commit.txt
cebe294 add diff.txt
bbe2af5 test
6237009 commit
78ea960 git commit test
7e7c298 test
fb89408 test
git reset
????用于將當(dāng)前HEAD復(fù)位到指定狀態(tài)舌镶。一般用于撤消之前的一些操作柱彻。
- 摘要
git reset [-q] [<tree-ish>] [--] <paths>…?
git reset (--patch | -p) [<tree-ish>] [--] [<paths>…?]
git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
- 概述
????在第一和第二種形式中,將條目從<tree-ish>復(fù)制到索引乎折。 在第三種形式中绒疗,將當(dāng)前分支頭(HEAD)設(shè)置為<commit>,可選擇修改索引和工作樹進(jìn)行匹配骂澄。所有形式的<tree-ish>/<commit>默認(rèn)為 HEAD 吓蘑。這里的 HEAD 關(guān)鍵字指的是當(dāng)前分支最末梢最新的一個(gè)提交。也就是版本庫(kù)中該分支上的最新版本坟冲。
????git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD]
:將當(dāng)前的分支重設(shè)(reset)到指定的<commit>或者HEAD(默認(rèn)磨镶,如果不顯示指定<commit>,默認(rèn)是HEAD健提,即最新的一次提交)琳猫,并且根據(jù)[mode]有可能更新索引和工作目錄。mode的取值可以是hard私痹、soft脐嫂、mixed统刮、merged、keep账千。
- --hard:重設(shè)(reset) 索引和工作目錄侥蒙,自從<commit>以來在工作目錄中的任何改變都被丟棄,并把HEAD指向<commit>匀奏。
- --soft:不觸及索引文件或工作樹(但重置HEAD到<commit>鞭衩,就像所有模式一樣)。這使得所有更改后的狀態(tài)變成已暫存娃善,如
git status
所示论衍。當(dāng)提交了之后,又發(fā)現(xiàn)代碼沒有提交完整聚磺,或者想重新編輯一下提交的信息坯台,可執(zhí)行g(shù)it reset --soft HEAD^,讓工作目錄還跟reset之前一樣咧最,不作任何改變捂人。 - --mixed:重置索引但不重置工作樹(即更改的文件被保留為未標(biāo)記提交),并報(bào)告未更新的內(nèi)容矢沿。這是默認(rèn)操作滥搭。
- --merge:重置索引并更新工作樹中不同于<commit>和HEAD之間的文件,但保留索引和工作樹之間不同的文件(即那些沒有添加的更改)捣鲸。即回退到<commit>之前的狀態(tài)瑟匆,但是工作區(qū)的修改不被重置。如果在<commit>和索引之間不同的文件有未分級(jí)的更改栽惶,則中止重置愁溜。
- --keep:重置索引條目并更新工作樹中不同于<commit>和HEAD的文件。如果在<commit>和HEAD之間不同的文件有本地更改外厂,則中止重置冕象。
- 示例
- 回退暫存的文件:
git reset HEAD <file>
- 回退到上一次提交版本:
git reset --hard HEAD^
- 回退到上上次提交版本:
git reset --hard HEAD^^
- 回退到上N次提交版本:
git reset --hard HEAD~N
- 回退到指定版本:
git reset --hard <commitId>
- 回退暫存的文件:
$ vi reset.txt #添加文件,內(nèi)容為reset
$ git add reset.txt #添加文件到暫存區(qū)
$ git status #查看當(dāng)前狀態(tài)
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: reset.txt
$ git reset HEAD reset.txt #回退暫存的文件
$ git status #查看當(dāng)前狀態(tài)
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
Untracked files:
(use "git add <file>..." to include in what will be committed)
reset.txt
nothing added to commit but untracked files present (use "git add" to track)
git reflog
????可以查看所有分支的所有操作記錄(包括提交汁蝶、回退渐扮、已刪除的提交操作記錄等)。
- 摘要
git reflog <subcommand> <options>
- 概述
????git reflog
除了能查看所有提交記錄外掖棉,還能查看會(huì)退墓律,已刪除等的操作記錄。git reflog
每行記錄都由版本號(hào)(commit id SHA)幔亥,HEAD值和操作描述三部分組成耻讽。版本號(hào)在第一列,HEAD值在第二列帕棉,操作描述信息在第三列针肥。當(dāng)我們會(huì)退出錯(cuò)時(shí)饼记,想回到某個(gè)新版本,就可以用git reflog
查看對(duì)應(yīng)的commitId祖驱,然后進(jìn)行會(huì)退握恳。
- 版本號(hào):標(biāo)識(shí)著每一次提交、合并等操作時(shí)的版本捺僻,相當(dāng)于唯一標(biāo)識(shí)
- HEAD值:同樣用來標(biāo)識(shí)版本,但是不同于版本號(hào)的是崇裁,Head值是相對(duì)的匕坯。
當(dāng)HEAD值為HEAD時(shí),表示為提交的最新版本拔稳;HEAD^表示為最新版本的上一個(gè)版本葛峻;HEAD^^表示為最新版本的上上個(gè)版本;HEAD~100表示為最新版本的往上第100個(gè)版本巴比。HEAD值越小术奖,表示版本越新,越大表示版本生成時(shí)間越久轻绞。
在下面例子中采记,我們發(fā)現(xiàn)HEAD值的展示形式為HEAD@{0}、HEAD@{1}政勃、HEAD@{2}...同樣HEAD值的數(shù)字越小唧龄,表示版本越新,數(shù)字越大表示版本越舊奸远。 - 操作描述:記錄了本次是哪種操作既棺,以及操作時(shí)編寫的描述信息。
- 示例
- 查看歷史版本記錄:
git reflog
- 查看歷史版本記錄-指定顯示條數(shù):
git reflog -n
- 顯示指定時(shí)間之后的提交(不包含當(dāng)前日期
--since懒叛,--affter
):git reflog --after={2018-04-18}
- 顯示指定時(shí)間之前的提交(包含當(dāng)前日期--until丸冕,--before):
git reflog --before={1.day.ago}
- 查看歷史版本記錄:
$ git reflog
cebe294 HEAD@{0}: reset: moving to HEAD^
deb9eb3 HEAD@{1}: commit: add commit.txt
cebe294 HEAD@{2}: commit: add diff.txt
bbe2af5 HEAD@{3}: commit: test
6237009 HEAD@{4}: commit: commit
78ea960 HEAD@{5}: commit: git commit test
7e7c298 HEAD@{6}: commit: test
fb89408 HEAD@{7}: commit (initial): test
$ git reflog -3
cebe294 HEAD@{0}: reset: moving to HEAD^
deb9eb3 HEAD@{1}: commit: add commit.txt
cebe294 HEAD@{2}: commit: add diff.txt
$ git reflog --after={2018-05-25}
cebe294 HEAD@{0}: reset: moving to HEAD^
deb9eb3 HEAD@{1}: commit: add commit.txt
cebe294 HEAD@{2}: commit: add diff.txt
bbe2af5 HEAD@{3}: commit: test
6237009 HEAD@{4}: commit: commit
78ea960 HEAD@{5}: commit: git commit test
7e7c298 HEAD@{6}: commit: test
fb89408 HEAD@{7}: commit (initial): test
git rm
????用于從工作區(qū)和索引中刪除文件。
- 摘要
git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…?
- 概述
????從索引中刪除文件薛窥,或從工作樹和索引中刪除文件胖烛。 git rm
不會(huì)從您的工作目錄中刪除文件。 (沒有任何選項(xiàng)只能從工作樹中刪除文件拆檬,并將其保留在索引中)要?jiǎng)h除的文件必須與分支的提示相同洪己,并且在索引中不能對(duì)其內(nèi)容進(jìn)行更新丽焊,盡管可以使用-f
選項(xiàng)覆蓋(默認(rèn)行為)剪菱。 當(dāng)給出--cached
時(shí)蕴侣,暫存區(qū)內(nèi)容必須與分支的提示或磁盤上的文件相匹配产捞,從而僅將文件從索引中刪除覆致。
????使用 git rm
來刪除文件路捧,同時(shí)還會(huì)將這個(gè)刪除操作記錄下來荒适;而使用 rm
來刪除文件玉转,僅僅是刪除了物理文件,沒有將其從 git 的記錄中剔除沃琅。
????直觀的來講哗咆,git rm
刪除過的文件,執(zhí)行 git commit
提交時(shí)益眉,會(huì)自動(dòng)將刪除該文件的操作提交上去晌柬。
????而對(duì)于用 rm
命令直接刪除的文件,執(zhí)行 git commit
提交時(shí)郭脂,則不會(huì)將刪除該文件的操作提交上去年碘。不過不要緊,即使你已經(jīng)通過 rm 將某個(gè)文件刪除掉了展鸡,也可以再通過 git rm
命令重新將該文件從 git 的記錄中刪除掉屿衅,這樣的話,在執(zhí)行 git commit
以后莹弊,也能將這個(gè)刪除操作提交上去涤久。
????如果之前不小心用 rm
命令刪除了一大批文件呢?如此時(shí)用 git rm
逐個(gè)地再刪除一次就顯得相當(dāng)卵痛了忍弛∠煊兀可如下的方式做提交:git commit -am "commit message or mark"
- 示例
- 刪除文件:
git rm <file>
- 刪除文件夾:
git rm <dir>
- 刪除文件:
$ ls
README.md commit.txt diff.txt reset.txt reset2.txt test.txt
$ git rm reset2.txt
$ git status
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: reset2.txt
$ ls
README.md commit.txt diff.txt reset.txt test.txt
git mv
????用于移動(dòng)或重命名文件,目錄或符號(hào)鏈接剧罩。
- 摘要
git mv <options>…? <args>…?
- 概述
????移動(dòng)或重命名文件栓拜,目錄或符號(hào)鏈接。移動(dòng)文件時(shí)惠昔,移動(dòng)目錄必須存在幕与。
- 示例
- 重命名文件:git mv <file1> <file2>
- 移動(dòng)文件到指定目錄:git mv <file> <dir>
$ git mv reset.txt reset2.txt
$ git status
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: reset.txt -> reset2.txt
git pull
????用于從另一個(gè)存儲(chǔ)庫(kù)或本地分支獲取并集成(整合)。git pull
命令的作用是:取回遠(yuǎn)程主機(jī)某個(gè)分支的更新镇防,再與本地的指定分支合并啦鸣。
- 摘要
git pull [options] [<repository> [<refspec>…?]]
- 概述
????將遠(yuǎn)程存儲(chǔ)庫(kù)中的更改合并到當(dāng)前分支中。在默認(rèn)模式下来氧,git pull
是git fetch
后跟git merge FETCH_HEAD
的縮寫诫给。更準(zhǔn)確地說,git pull
使用給定的參數(shù)運(yùn)行git fetch
啦扬,并調(diào)用git merge
將檢索到的分支頭合并到當(dāng)前分支中中狂。 如果使用--rebase
,它運(yùn)行是git rebase
而不是git merge
扑毡。
- 示例
$ git pull https://github.com/huangyangneng/demo.git master:master
Already up-to-date.
git push
????用于將本地分支的更新胃榕,推送到遠(yuǎn)程倉(cāng)庫(kù)。
- 摘要
git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
[--repo=<repository>] [-f | --force] [-d | --delete] [--prune] [-v | --verbose]
[-u | --set-upstream] [--push-option=<string>]
[--[no-]signed|--signed=(true|false|if-asked)]
[--force-with-lease[=<refname>[:<expect>]]]
[--no-verify] [<repository> [<refspec>…?]]
- 概述
????使用本地引用更新遠(yuǎn)程引用瞄摊,同時(shí)發(fā)送完成給定引用所需的對(duì)象勋又】嗑颍可以在每次推入存儲(chǔ)庫(kù)時(shí),通過在那里設(shè)置掛鉤觸發(fā)一些事件楔壤。當(dāng)命令行不指定使用<repository>參數(shù)推送的位置時(shí)鹤啡,將查詢當(dāng)前分支的branch.*.remote配置以確定要在哪里推送。 如果配置丟失蹲嚣,則默認(rèn)為origin递瑰。
- 示例
- 將本地的master分支推送到origin主機(jī)的master分支。如果master不存在隙畜,則會(huì)被新建:
git push origin master
- 當(dāng)前分支與遠(yuǎn)程分支之間存在追蹤關(guān)系泣矛,則本地分支和遠(yuǎn)程分支都可以省略:
git push origin
- 如果當(dāng)前分支只有一個(gè)追蹤分支,那么主機(jī)名都可以省略:
git push
- 如果當(dāng)前分支與多個(gè)主機(jī)存在追蹤關(guān)系禾蚕,則可以使用-u選項(xiàng)指定一個(gè)默認(rèn)主機(jī),這樣后面就可以不加任何參數(shù)使用
git push
:git push -u origin master
- 將本地的master分支推送到origin主機(jī)的master分支。如果master不存在隙畜,則會(huì)被新建:
$ git push
Username for 'https://github.com': huangyangneng
Password for 'https://huangyangneng@github.com':
Counting objects: 37, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (25/25), done.
Writing objects: 100% (37/37), 2.94 KiB | 0 bytes/s, done.
Total 37 (delta 7), reused 0 (delta 0)
remote: Resolving deltas: 100% (7/7), done.
To https://github.com/huangyangneng/demo.git
* [new branch] master -> master
分支管理
????幾乎所有的版本控制系統(tǒng)都以某種形式支持分支狂丝。 使用分支意味著你可以把你的工作從開發(fā)主線上分離開來换淆,以免影響開發(fā)主線。 在很多版本控制系統(tǒng)中几颜,這是一個(gè)略微低效的過程——常常需要完全創(chuàng)建一個(gè)源代碼目錄的副本倍试。對(duì)于大項(xiàng)目來說,這樣的過程會(huì)耗費(fèi)很多時(shí)間蛋哭。
????Git 處理分支的方式可謂是難以置信的輕量县习,創(chuàng)建新分支這一操作幾乎能在瞬間完成,并且在不同分支之間的切換操作也是一樣便捷谆趾。
????當(dāng)我們用git init
初始化一個(gè)倉(cāng)庫(kù)時(shí)躁愿,此時(shí)git會(huì)默認(rèn)幫我們創(chuàng)建一個(gè)主分支,即master分支沪蓬。以及一個(gè)指向master分支的HEAD指針彤钟。一開始,master分支是一條線跷叉,Git用master指向最新的提交逸雹,再用HEAD指向master,就能確定當(dāng)前分支云挟,以及當(dāng)前分支的提交點(diǎn):
????每次提交梆砸,master分支都會(huì)向前移動(dòng)一步,HEAD始終指向master园欣。這樣帖世,隨著你不斷提交,master分支的線也越來越長(zhǎng)俊庇。
????但我們創(chuàng)建一個(gè)新的分支并切換到新分支時(shí)狮暑,比如branchtest鸡挠,此時(shí)git會(huì)新建一個(gè)可移動(dòng)的指針,叫做branchtest搬男,指向master相同的位置拣展,再把HEAD指向branchtest,就表示當(dāng)前分支在branchtest上:
????從上面我們可以看出缔逛,git創(chuàng)建分支是很快的备埃,因?yàn)榫蛣?chuàng)建了一個(gè)新的指針。切換分支也是很快的褐奴,因?yàn)榫桶袶EAD指針指到對(duì)應(yīng)的分支上面按脚。
????然后我們?cè)谛碌姆种闲薷奶峤唬琤ranchtest指針就向前移動(dòng)敦冬,而master分支位置不變辅搬。
????當(dāng)我們?cè)赽ranchtest上面的工作做完后,就可以把branchtest分支合并到master分支了脖旱。git分支合并也很快堪遂,只需要把master指向當(dāng)前的提交就完成了合并。
????當(dāng)我們把branchtest分支合并到master分支后萌庆,如果不需要branchtest分支了溶褪,我們就可以刪除掉branchtest分支了,git刪除分支就是把branchtest指針刪除掉践险。
branch
????用于列出猿妈,創(chuàng)建或刪除分支。
- 摘要
git branch [--color[=<when>] | --no-color] [-r | -a]
[--list] [-v [--abbrev=<length> | --no-abbrev]]
[--column[=<options>] | --no-column] [--sort=<key>]
[(--merged | --no-merged) [<commit>]]
[--contains [<commit]] [--no-contains [<commit>]]
[--points-at <object>] [--format=<format>] [<pattern>…?]
git branch [--track | --no-track] [-l] [-f] <branchname> [<start-point>]
git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
git branch --unset-upstream [<branchname>]
git branch (-m | -M) [<oldbranch>] <newbranch>
git branch (-c | -C) [<oldbranch>] <newbranch>
git branch (-d | -D) [-r] <branchname>…?
git branch --edit-description [<branchname>]
- 概述
????如果給出了--list
或者如果沒有非選項(xiàng)參數(shù)巍虫,則列出現(xiàn)有的分支; 當(dāng)前分支將以星號(hào)突出顯示彭则。 選項(xiàng)-r
導(dǎo)致遠(yuǎn)程跟蹤分支被列出,而選項(xiàng)-a
顯示本地和遠(yuǎn)程分支垫言。 如果給出了一個(gè)<pattern>贰剥,它將被用作一個(gè)shell通配符,將輸出限制為匹配的分支筷频。 如果給出多個(gè)模式蚌成,如果匹配任何模式,則顯示分支凛捏。 請(qǐng)注意担忧,提供<pattern>時(shí),必須使用--list
; 否則命令被解釋為分支創(chuàng)建坯癣。
- 示例
- 查看當(dāng)前有哪些分支:
git branch or git branch --list
- 新建一個(gè)分支:
git branch <branchName>
- 切換到某一個(gè)分支:
git checkout <branchName>
- 查看本地和遠(yuǎn)程分支:
git branch -a
- 重命名分支:
git branch -m or -M <oldBranchName> <newBranchName>
- 刪除分支:
git branch -d or -D <branchName>
- 刪除遠(yuǎn)程分支:
git branch -r -d origin/<branchName>
andgit push origin :<branchName>
- 查看當(dāng)前有哪些分支:
#查看當(dāng)前有哪些分支
$ git branch
* master
#新建分支
$ git branch branchtest
$ git branch
branchtest
* master
#切換到某個(gè)分只
$ git checkout branchtest
$ git branch
* branchtest
master
#查看本地和遠(yuǎn)程分支
$ git branch -a
* branchtest
master
remotes/origin/master
#重命名分支
$ git branch -m branchtest branchtest1
$ git banch
branchtest1
* master
#刪除分支
$ git branch -d branchtest1
Deleted branch branchtest1 (was 35306f2).
$ git branch
* master
git checkout
????用于切換分支或恢復(fù)工作樹文件瓶盛。
- 摘要
git checkout [-q] [-f] [-m] [<branch>]
git checkout [-q] [-f] [-m] --detach [<branch>]
git checkout [-q] [-f] [-m] [--detach] <commit>
git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>]
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>…?
git checkout [<tree-ish>] [--] <pathspec>…?
git checkout (-p|--patch) [<tree-ish>] [--] [<paths>…?]
- 概述
????更新工作樹中的文件以匹配索引或指定樹中的版本。如果沒有給出路徑,git checkout
還會(huì)更新HEAD,將指定的分支設(shè)置為當(dāng)前分支惩猫。
- 示例
- 切換到指定分支:
git checkout branchName
- 創(chuàng)建并切換到指定分支:
git checkout -b branchName
- 從另一個(gè)提交或分支中取出文件:
git checkout <commitId or branchName> <file>
- 從緩存區(qū)中恢復(fù)文件:
git checkout <file>
芝硬,注意這個(gè)操作是不可逆的,當(dāng)執(zhí)行這個(gè)操作轧房,會(huì)把工作區(qū)中當(dāng)前文件為緩存的修改重置掉拌阴。
- 切換到指定分支:
$ git checkout -b branchtest #創(chuàng)建并切換到branchtest分支
$ git branch #查看所有的分支,當(dāng)前分支前面有個(gè)*號(hào)
* branchtest
master
$ git checkout master #切換到master分支
$ git branch
branchtest
* master
$ vi reset2.txt #在branchtest 分支上新增一個(gè)文件奶镶,內(nèi)容為reset
$ git add reset2.txt
$ git commit -m "reset2.txt"
$ git checkout master
$ git checkout branchtest reset2.txt
$ ls #可以看的在master分支上也有reset2.txt文件
README.md commit.txt diff.txt reset.txt reset2.txt test.txt
merge
????用于將兩個(gè)或兩個(gè)以上的分支合并一起迟赃。
- 摘要
git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit]
[-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
[--[no-]allow-unrelated-histories]
[--[no-]rerere-autoupdate] [-m <msg>] [<commit>…?]
git merge --abort
git merge --continue
- 概述
????將命名約定的更改合并到當(dāng)前分支中。這個(gè)命令被git pull 合并來自另一個(gè)存儲(chǔ)庫(kù)的更改厂镇,并且可以手工使用以將更改從一個(gè)分支合并到另一個(gè)分支纤壁。
- 示例
- 合并分支到當(dāng)前分支,自動(dòng)進(jìn)行新的提交:
git merge <branchName>
- 合并分支到當(dāng)前分支中捺信,但不要自動(dòng)進(jìn)行新的提交:
git merge --no-commit <branchName>
- 合并多個(gè)分支到當(dāng)前分支:
git merge <branchName1> <branchName2> <branchNameN> -m "message"
- 合并分支到當(dāng)前分支,自動(dòng)進(jìn)行新的提交:
- 查看分支合并情況:
git log --graph --pretty=oneline --abbrev-commit
#合并分支到當(dāng)前分支酌媒,首先我們?cè)赽ranchtest分支新建一個(gè)文件branchtest.txt,內(nèi)容為branchtest迄靠,然后提交馍佑;再l s切換到master分支,進(jìn)行合并梨水,會(huì)發(fā)現(xiàn)master分支上有branchtest.txt文件
$ echo "branchtest" > branchtest.txt
$ git add -A
$ git commit -m "new branchtest.txt"
[branchtest e4a8286] new branchtest.txt
1 file changed, 1 insertion(+)
create mode 100644 branchtest.txt
$ git checkout branchtest
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
$ git merge branchtest
Updating 35306f2..e4a8286
Fast-forward
branchtest.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 branchtest.txt
mergetool
????用于運(yùn)行合并沖突解決工具來解決合并沖突。
- 摘要
git mergetool [--tool=<tool>] [-y | --[no-]prompt] [<file>…?]
- 概述
????git mergetool
命令用于運(yùn)行合并沖突解決工具來解決合并沖突茵臭。使用git mergetool
運(yùn)行合并實(shí)用程序來解決合并沖突疫诽。它通常在git合并后運(yùn)行。
????如果給出一個(gè)或多個(gè)<file>
參數(shù)旦委,則將運(yùn)行合并工具程序來解決每個(gè)文件的差異(跳過那些沒有沖突的文件)奇徒。 指定目錄將包括該路徑中的所有未解析文件。 如果沒有指定<file>
名稱缨硝,git mergetool
將在具有合并沖突的每個(gè)文件上運(yùn)行合并工具程序摩钙。
- 示例
#首先我們分別進(jìn)入branchtest 和branchtest2 分支,然后修改branchtest.txt文件內(nèi)容查辩,并提交胖笛。然后切換到master分支,把這兩個(gè)分支合并到master宜岛,就會(huì)發(fā)現(xiàn)有沖突长踊,然后我們用git mergetool解決合并沖突后,在提交萍倡;
$ git merge branchtest branchtest2 -m "merge branchtest branchtest2 to merge"
Trying simple merge with branchtest
Simple merge did not work, trying automatic merge.
Auto-merging branchtest.txt
ERROR: content conflict in branchtest.txt
fatal: merge program failed
Automated merge did not work.
Should not be doing an Octopus.
Merge with strategy octopus failed.
$ git mergetool
This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
tortoisemerge emerge vimdiff
Merging:
branchtest.txt
Normal merge conflict for 'branchtest.txt':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (vimdiff):
#我們輸入文件名稱身弊,然后可以看到文件的沖突,我們修改完沖突后保存再提交。
git stash
????用于將更改儲(chǔ)藏在臟工作目錄中阱佛。
- 摘要
git stash list [<options>]
git stash show [<stash>]
git stash drop [-q|--quiet] [<stash>]
git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
git stash branch <branchname> [<stash>]
git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
[-u|--include-untracked] [-a|--all] [-m|--message <message>]
[--] [<pathspec>…?]]
git stash clear
git stash create [<message>]
git stash store [-m|--message <message>] [-q|--quiet] <commit>
- 概述
????當(dāng)要記錄工作目錄和索引的當(dāng)前狀態(tài)帖汞,但想要返回到干凈的工作目錄時(shí),則使用git stash
凑术。 該命令保存本地修改翩蘸,并恢復(fù)工作目錄以匹配HEAD提交。
????這個(gè)命令所儲(chǔ)藏的修改可以使用git stash list
列出麦萤,使用git stash show
進(jìn)行檢查鹿鳖,并使用git stash apply
恢復(fù)(可能在不同的提交之上)。調(diào)用沒有任何參數(shù)的git stash
相當(dāng)于git stash save
壮莹。 默認(rèn)情況下翅帜,儲(chǔ)藏列表為“分支名稱上的WIP”,但您可以在創(chuàng)建一個(gè)消息時(shí)在命令行上給出更具描述性的消息命满。
- 示例
- 把當(dāng)前工作現(xiàn)場(chǎng)“儲(chǔ)藏”起來:
git stash
- 查看現(xiàn)有的儲(chǔ)藏:
git stash list
- 恢復(fù)工作區(qū):
git stash apply(恢復(fù))
andgit stash drop(刪除stash內(nèi)容)
orgit stash pop(恢復(fù)并刪除stash內(nèi)容)
- 把當(dāng)前工作現(xiàn)場(chǎng)“儲(chǔ)藏”起來:
$ git status
On branch master
Your branch is ahead of 'origin/master' by 12 commits.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: branchtest.txt
$ git stash
Saved working directory and index state WIP on master: 4391d47 test
HEAD is now at 4391d47 test
$ git status
On branch master
Your branch is ahead of 'origin/master' by 12 commits.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
$ git stash list
stash@{0}: WIP on master: 4391d47 test
$ git stash pop
On branch master
Your branch is ahead of 'origin/master' by 12 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: branchtest.txt
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (c73b9457deff50245ba42fe6ac7e722c679ec43b)
標(biāo)簽管理
git tag
????用于創(chuàng)建涝滴,列出,刪除或驗(yàn)證使用GPG簽名的標(biāo)簽對(duì)象胶台。同大多數(shù) VCS 一樣歼疮,Git 也可以對(duì)某一時(shí)間點(diǎn)上的版本打上標(biāo)簽。在發(fā)布某個(gè)軟件版本(比如 v1.0 等等)的時(shí)候诈唬,經(jīng)常這么做韩脏。
- 摘要
git tag [-a | -s | -u <keyid>] [-f] [-m <msg> | -F <file>] [-e]
<tagname> [<commit> | <object>]
git tag -d <tagname>…?
git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]
[--points-at <object>] [--column[=<options>] | --no-column]
[--create-reflog] [--sort=<key>] [--format=<format>]
[--[no-]merged [<commit>]] [<pattern>…?]
git tag -v [--format=<format>] <tagname>…?
- 概述
????在refs/tags/中添加標(biāo)簽引用,除此之外還可以提供了-d/-l/-v
來刪除铸磅,列出或驗(yàn)證標(biāo)簽赡矢。
????tag 用于創(chuàng)建一個(gè)標(biāo)簽用于在開發(fā)階段,某個(gè)階段的完成阅仔,創(chuàng)建一個(gè)版本吹散,在開發(fā)中都會(huì)使用到, 可以創(chuàng)建一個(gè)tag來指向軟件開發(fā)中的一個(gè)關(guān)鍵時(shí)期,比如版本號(hào)更新的時(shí)候可以建一個(gè)version1.0, version1.2之類的標(biāo)簽八酒,這樣在以后回顧的時(shí)候會(huì)比較方便空民。除非指定-f選項(xiàng),否則不能創(chuàng)建已經(jīng)存在的標(biāo)簽羞迷。
????如果傳遞了-a
界轩,-s
或-u <keyid>
中的一個(gè),該命令將創(chuàng)建一個(gè)標(biāo)簽對(duì)象衔瓮,并且需要一個(gè)標(biāo)簽消息耸棒。 除非-m <msg>
或-F <file>
,否則將啟動(dòng)一個(gè)編輯器报辱,供用戶輸入標(biāo)簽消息与殃。
- 示例
- 創(chuàng)建標(biāo)簽(默認(rèn)為HEAD单山,也可以指定一個(gè)commit id):
git tag <tagName>
orgit tag -a <tagName> -m "標(biāo)簽說明"
orgit tag <tagName> <commitId>
- 列顯已有的標(biāo)簽:
git tag
orgit tag -l <tagName>(列出指定的標(biāo)簽)
- 刪除標(biāo)簽:
git tag -d <tagName>
- 創(chuàng)建標(biāo)簽(默認(rèn)為HEAD单山,也可以指定一個(gè)commit id):
#新建標(biāo)簽
$ git tag -a v1.0.0 -m "first tag"
# 列出也有標(biāo)簽
$ git tag
v1.0.0
# git show 命令查看相應(yīng)標(biāo)簽的版本信息,并連同顯示打標(biāo)簽時(shí)的提交對(duì)象幅疼。
$ git show v1.0.0
tag v1.0.0
Tagger: huangyangneng <test@qq.com>
Date: Tue May 29 16:21:58 2018 +0800
first tag
commit 3e579e852686a0614ea0f98e65cc8a74d6aaf872
Merge: 8b6af52 eb9766f 29e1a25
Author: huangyangneng <test@qq.com>
Date: Tue May 29 15:12:15 2018 +0800
update branchtest
diff --cc branchtest.txt
index 693fd50,26c1c20,0d5c17e..8a1c860
--- a/branchtest.txt
+++ b/branchtest.txt
@@@@ -1,1 -1,2 -1,2 +1,3 @@@@
branchtest
+ +test
++ tesetset
localhost:demo huangyangneng
#刪除標(biāo)簽
$ git tag -d v1.0.0
Deleted tag 'v1.0.0' (was 37b4083)
????整理文章主要為了自己日后復(fù)習(xí)用米奸,文章中可能會(huì)引用到別的博主的文章,如涉及到博主的版權(quán)問題爽篷,請(qǐng)博主聯(lián)系我悴晰。