Git基礎(chǔ)教程

簡(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 pullgit 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 pushgit push -u origin master
$ 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> and git push origin :<branchName>
#查看當(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"
  • 查看分支合并情況: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
分支合并圖.png

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):
#我們輸入文件名稱身弊,然后可以看到文件的沖突,我們修改完沖突后保存再提交。
mergetool命令工具.png

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ù)) and git stash drop(刪除stash內(nèi)容) or git stash pop(恢復(fù)并刪除stash內(nèi)容)
$ 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> or git tag -a <tagName> -m "標(biāo)簽說明" or git tag <tagName> <commitId>
    • 列顯已有的標(biāo)簽:git tag or git tag -l <tagName>(列出指定的標(biāo)簽)
    • 刪除標(biāo)簽:git tag -d <tagName>
#新建標(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)系我悴晰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市逐工,隨后出現(xiàn)的幾起案子铡溪,更是在濱河造成了極大的恐慌,老刑警劉巖泪喊,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棕硫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡袒啼,警方通過查閱死者的電腦和手機(jī)哈扮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚓再,“玉大人滑肉,你說我怎么就攤上這事≌觯” “怎么了靶庙?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)娃属。 經(jīng)常有香客問我惶洲,道長(zhǎng),這世上最難降的妖魔是什么膳犹? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮签则,結(jié)果婚禮上须床,老公的妹妹穿的比我還像新娘。我一直安慰自己渐裂,他們只是感情好豺旬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柒凉,像睡著了一般族阅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膝捞,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天坦刀,我揣著相機(jī)與錄音,去河邊找鬼。 笑死鲤遥,一個(gè)胖子當(dāng)著我的面吹牛沐寺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盖奈,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼混坞,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了钢坦?” 一聲冷哼從身側(cè)響起究孕,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎爹凹,沒想到半個(gè)月后厨诸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逛万,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年泳猬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宇植。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡得封,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出指郁,到底是詐尸還是另有隱情忙上,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布闲坎,位于F島的核電站疫粥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏腰懂。R本人自食惡果不足惜梗逮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绣溜。 院中可真熱鬧慷彤,春花似錦、人聲如沸怖喻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锚沸。三九已至跋选,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哗蜈,已是汗流浹背前标。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工坠韩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人候生。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓同眯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親唯鸭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子须蜗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉(cāng)庫(kù)完整的鏡像下來目溉。這樣一來明肮,任何一處協(xié)同...
    __silhouette閱讀 15,887評(píng)論 5 147
  • Git 命令行學(xué)習(xí)筆記 Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉(cāng)庫(kù)完整的鏡像下來...
    sunnyghx閱讀 3,921評(píng)論 0 11
  • 變量是存儲(chǔ)信息的容器缭付。 變量必須以字母開頭 變量也能以 $ 和 _ 符號(hào)開頭(不過我們不推薦這么做) 變量名稱對(duì)大...
    safiriGitHub閱讀 168評(píng)論 0 0
  • 研究發(fā)現(xiàn)陷猫,酒店單是在辦理入住時(shí)請(qǐng)客人們?cè)诃h(huán)保倡議卡上做一個(gè)與環(huán)保有關(guān)的小承諾:一是在“愿意在入住期間重復(fù)使用毛巾”...
    耳紋AI一侯公子閱讀 326評(píng)論 0 1