Git命令詳解和實戰技巧

git init

git init 命令能夠建立一個空的Git Repository ,也能夠把任何一個目錄變成一個 Git Repository 。html

git init 命令後跟着一個目錄名就會建立一個空的Git Repository,不然就是把當前的目錄變成一個 Git Repository。vue

一個空的Git Repository目錄裏面除了有一個.git目錄以外什麼都沒有。git

git clone

clone 命令能夠克隆一個版本庫。很是簡單好用,完整形式是 git clone 倉庫 <目錄> ,目錄能夠省略。 新克隆出來的這個版本庫裏的.git/config文件會記錄上游版本庫repository的位置github

$git clone git@gitlab.demo.com:gp/git-demo.git
Cloning into 'git-demo'...

#git clone <repository> <directory> 
$git clone git@gitlab.demo.com:gp/git-demo.git abc
Cloning into 'abc'...

#使用Git下載v2分支代碼,使用命令:
git clone -b v2  https://github.com/vuejs/vue-cli.git

#克隆出來的版本庫不包括工做區,直接就是版本庫的內容,也就是不包括.git目錄。
#而是直接就是.git目錄裏面的內容。這樣的版本庫稱爲裸版本庫
git clone --bare   <repository> <directory>

#也是克隆出一個裸版本庫。不過是能夠經過git fetch命令與上游版本庫repository持續同步。
git clone --mirror <repository> <directory>
複製代碼

git-clone官網web

git add

git add . git add -A 和 git add -u的區別vue-cli

經我驗證,個人git version 2.9.2 是這樣的。1版本的有不一樣。 shell

  • git add . 操做的對象是當前目錄下的全部變動(增+改+刪),. 表示當前目錄。
  • git add -A 操做的對象是整個工做區的全部變動(增+改+刪),不管當前位於哪一個目錄下。
  • git add -u 操做的對象是整個工做區已經跟蹤的變動(update: 只包括更新和刪除,不包括新增),不管當前位於哪一個目錄下。
  • 可是別的文章寫道 git add *會忽略.gitignore把任何文件都加入,然爾,我試事後和git add -A同樣。
➜  daybyday git:(master) git add * # 若是想添加,只能用-f強制加入 
The following paths are ignored by one of your .gitignore files:
dist1
Use -f if you really want to add them.
複製代碼
  • $git add READMD.md .gitignore 多個文件用空格分開
  • git add命令能夠用-f(force)選項添加被忽略的文件

git push

git push 命令會把本地版本庫的git對象上傳到遠程版本庫,並用本地分支引用更新遠程版本庫對應分支的引用。npm

  • push命令的比較完整的寫法是git push 上游版本庫 本地分支:遠程分支 ,當本地分支於遠程分支同名時只需 git push 上游版本庫 本地分支vim

  • push不光能夠推送到遠程已經存在的分支,也能夠推送到不存在的分支,當推送到不存在分支時,就建立了這個遠程分支。api

  • 在每次push前 必定要先pull一下,同步一下遠程版本庫的最新信息。當push到不存在的分支時必定是成功的。

$git checkout develop
$git push origin develop:feature                        
* [new branch]      develop -> feature #這樣就在遠程版本庫建立了一個feature新分支

# 刪除遠程的feature分支
➜  daybyday git:(master) git push origin :feature 
To git@gitlab.demo.com:gaopo/daybyday.git
- [deleted]         feature
複製代碼

git pull 和 git fetch

git fetch

  • git fetch 命令能夠把上游版本庫的更新下載到本地版本庫,這個更新包括Git對象和分支引用。

當上遊版本庫有新的提交後,上游版本庫相關的分支文件會被更新,objects目錄裏會多了最新提交所對應的commit , tree,和blob對象。git fetch命令就是負責把這些更新下載到本地版本庫。

本地版本庫執行了git pull或 git fetch命令後,.git/refs/heads/remotes/origin目錄下會生成對應的分支文件。

git pull

git pull 命令等價於 git fetch + git merge

git pull 命令先把遠程版本庫的更新下載到本地,而後和本地的分支合併 。

$git pull origin develop
#上面這條命令和用下面的兩條命令的作的事情同樣
$git fetch
$git merge origin/develop
複製代碼

git remote

  • git clone以後本地就會有一個名爲 origin的上游,上游的分支信息保存在 .git/refs/remotes/origin 目錄下 。

  • 其實git版本庫能夠有多個上游版本庫,這徹底取決於實際的須要。

  • git remote add 上游名 URL 命令能夠添加上游版本庫。如今咱們就用這個命令再添加一個上游版本庫,隨便起個名字好比叫 upstream2

查看

$ git remote -v
bakkdoor  https://github.com/bakkdoor/grit (fetch)
bakkdoor  https://github.com/bakkdoor/grit (push)
cho45     https://github.com/cho45/grit (fetch)
cho45     https://github.com/cho45/grit (push)
#查看某一個遠程倉庫的更多信息
$ git remote show origin
複製代碼

新增

$git remote add upstream2 http://git.demo.com/gp/git-demo2.git
$cat .git/config
...
[remote "origin"]
    url = git@gitlab.demo.com:gp/git-demo.git
    fetch = +refs/heads/*:refs/remotes/origin/*
#多了一個[remote]節點,名爲upstream2
[remote "upstream2"]
    url = http://git.demo.com/gp/git-demo2.git
    fetch = +refs/heads/*:refs/remotes/upstream2/*
    
複製代碼

修改、重命名和刪除

#修改upstream2上游版本庫的URL
$git remote set-url upstream2 git@gitlab.demo.com:gp/git-demo.git 
#把upstream2重命名成upstream1
$git remote rename upstream2 upstream1                                       
$cat .git/config
...
[remote "origin"]
    url = git@gitlab.demo.com:gp/git-demo.git
    fetch = +refs/heads/*:refs/remotes/origin/*
...
#名字變爲了upstream1,以前是upstream2
[remote "upstream1"] 
    url = git@gitlab.demo.com:gp/git-demo.git  
    #URL變成了git-demo.git , 以前是git-demo2.git
    fetch = +refs/heads/*:refs/remotes/upstream1/*
#刪除上游版本庫upstream1,.git/config文件的[remote "upstream1"]節點會被刪掉 
$git remote rm upstream1                   
複製代碼

git remote 的相關命令就是修改 .git/config文件而已,其實咱們也能夠手動編輯完成。

分支

git branch 查看本地分支 , git branch -r 查看遠程分支 , git branch -a 查看全部分支, git branch -v 現實分支對應的提交號 git branch 分支名 ,基於頭指針(HEAD)建立一個分支 git branch 分支名 提交號 基於指定的提交號建立一個分支 git branch -D 分支名刪除一個分支 git branch -m 舊分支名 新分支名 重命名一個分支

#git checkout -b 新建並切換分支, 等價於 git branch feature ; git checkout feature
$git checkout -b feature 

$git branch
  develop
* feature
  master
$git checkout master
$git branch -D feature   #git branch -D 刪除一個分支
Deleted branch feature (was e6361ed).
複製代碼

tag

在 Git 中列出已有的標籤是很是簡單直觀的。 只須要輸入 git tag:

$ git tag
v0.1
v1.3
...
#若是隻對 1.8.5 系列感興趣,能夠運行:
$ git tag -l 'v1.8.5*'
複製代碼

建立標籤

Git 使用兩種主要類型的標籤:輕量標籤(lightweight)與附註標籤(annotated)。

  • 一個輕量標籤很像一個不會改變的分支 - 它只是一個特定提交的引用。
#建立輕量標籤,不須要使用 -a、-s 或 -m 選項,只須要提供標籤名字:
$ git tag v1.4-lw
$ git tag
v1.4
v1.4-lw
v1.5
複製代碼
  • 在 Git 中建立一個附註標籤是很簡單的。 最簡單的方式是當你在運行 tag 命令時指定 -a 選項:
$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
v1.4
複製代碼

經過使用 git show 命令能夠看到標籤信息與對應的提交信息:

$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:19:12 2014 -0700

my version 1.4

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number
複製代碼

默認狀況下,git push 命令並不會傳送標籤到遠程倉庫服務器上。

若是想要一次性推送不少標籤,也可使用帶有 --tags 選項的 git push 命令。 這將會把全部不在遠程倉庫服務器上的標籤所有傳送到那裏。

$ git push origin v1.5
$ git push origin --tags
複製代碼

刪除標籤

要刪除掉你本地倉庫上的標籤,可使用命令 git tag -d <tagname>。例如,可使用下面的命令刪除掉一個輕量級標籤:

$ git tag -d v1.4-lw Deleted tag 'v1.4-lw' (was e7d5add) 應該注意的是上述命令並不會從任何遠程倉庫中移除這個標籤,你必須使用 git push <remote> :refs/tags/<tagname>來更新你的遠程倉庫:

#git push 上游版本庫 :tagname 刪除遠程里程碑
$ git push origin :refs/tags/v1.4-lw
To /git@github.com:schacon/simplegit.git
 - [deleted]         v1.4-lw
複製代碼

git status

$git status
On branch develop
Your branch is up-to-date with 'origin/develop'.
Changes to be committed:                          #暫存區須要commit到版本庫的文件
  (use "git reset HEAD <file>..." to unstage)
  
    modified:   .gitignore
  
Changes not staged for commit:                    #已經加入到暫存區以後又修改了的文件,這時要麼再次add暫存區,要麼用暫存區的快照覆蓋工做區這個文件
  (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:                                  #還歷來沒有add到暫存區的文件 ,Untracked ,未跟蹤
  (use "git add <file>..." to include in what will be committed)
  
    a.txt
複製代碼

git config

用戶名和郵箱地址至關於你的身份標識,是本地Git客戶端的一個變量,不會隨着Git庫而改變。

每次commit都會用用戶名和郵箱紀錄。

github的contributions跟你的郵箱是有關聯的。

#查看本身的用戶名和郵箱地址
$ git config user.name
$ git config user.email

#修改本身的用戶名和郵箱地址
$ git config --global user.name "xxx"
$ git config --global user.email "xxx"

複製代碼

git diff

git diff #命令能夠查看工做區,暫存區,版本庫之間文件的差異
git diff #工做區和暫存區之間的差異
git diff HEAD  #工做區和版本庫之間的差異
git diff --staged #暫存區和版本庫之間的差異
複製代碼

git commit + log

git commit 命令生成一個commit對象以及這個commit對象對應的一系列tree對象和blob對象。這個commit對象的tree對象的與暫存區的目錄樹指向一樣的內容。 經常使用的用法是 git commit -m 'commit message' ,最近的一次 'commit message'會保存在 .git/COMMIT_EDITMSG 文件中。

git log --graph    #經過簡單圖形現實分支之間的merge關係,可是不太好用,通常都用工具看。
#git log --pretty=raw 現實提交的詳細內容
commit 44842943fc03c341e7ec98e909de9cae9f814d22
tree 4a9cfd52af007896b16466a08391f6823907456f
parent 66c9c59da472f310284371bcae7f88ca707991a1
parent f27425799dfa432b015e44788d05443a38545266
author gaopo <gaopo@demo.com> 1554785199 +0800
committer gaopo <gaopo@demo.com> 1554785199 +0800

    解決衝突

#git log --stat 能夠現實本次提交所新增和修改的文件
 .idea/workspace.xml             | 18 ++++++++----------
 app/controllers/api/dingtalk.js |  8 ++++----
 2 files changed, 12 insertions(+), 14 deletions(-)

git log -數字   #只現實數字指定的最近幾回提交


複製代碼

能夠經過 git commit --amend -m 'commit 的要改爲的內容' 修改上一次提交的描述,也能夠 git commit --amend 直接打開編輯器修改(vim)。

更多技巧>Git 基礎 - 查看提交歷史

reset

git reset 命令是Git最經常使用的命令之一,用來重置分支的引用和替換暫存區和工做區。

git reset --hard 提交號 這個命令會將當前分支的引用指向新的提交號。替換暫存區,替換後暫存區的內容和新提交的tree一致。替換工做區,替換後工做區內容和暫存區一致。執行這個命令後會讓工做區 暫存區 版本庫的內容一致。

git reset --soft 提交號 這個命令只會更變當前分支的引用,不影響暫存區和工做區。好比 git reset --soft HEAD^ 會將引用向前回退一次。

git reset --mixed 提交號 這是git reset命令默認的形式,改變當前分支的引用和替換暫存區,不影響工做區。

git reset 或 git reset HEAD 命令會用HEAD指向的目錄樹(tree)重置暫存區,不影響工做區。

git reset 文件名 或 git reset HEAD 文件名 這個命令會將對應文件的改動撤出暫存區,即用HEAD提交中的文件替換暫存區中的文件,不影響工做區。

git reset 能夠重置分支引用,是由於他修改了 refs/heads/下的分支文件的內容。

.gitignore 忽略說明

經常使用以下:

`dist` #忽略文件夾dist/,dist文件名,dist.各類文件後綴如(dist.html,dist.js...),不管哪一個文件夾級。
`dist/` #忽略文件夾dist/,根目錄或者其餘子目錄裏面有dist/ 都忽略。
`/dist` #只忽略根目錄文件夾dist/,不忽略其餘子目錄裏面dist/。

/dist/*
!/dist/bin/
#忽略 /dist/目錄下所有內容,可是不忽略bin目錄下的

/dist/*
!/dist/5.html
#忽略 /dist/目錄下所有內容,可是不忽略5.html

/abc/*
!/abc/*.html
#忽略 /dist/目錄下所有內容,可是不忽略`html`爲擴展名的文件

#注意:若是父目錄已經被忽略,要先對父目錄使用!規則`!/dist/`,使其不被排除。

# 刪除掉.gitignore裏面過濾的文件
➜  daybyday git:(master) ✗ git clean -fX
Removing .DS_Store
Removing fw/hul.js

複製代碼

git rm

git rm 會把工做區和暫存區都刪掉

刪除遠程倉庫中之前上傳的此類文件而保留本地文件

# -r 遞歸刪除
# --cached 只刪除索引區(暫存區),不管工做區修改沒有都將保留工做區。
➜  daybyday git:(master) ✗ git rm --cached dist1     
fatal: not removing 'dist1' recursively without -r
➜  daybyday git:(master) ✗ git rm --cached -r  dist1
rm 'dist1/dist/sdf.html'
rm 'dist1/new.html'
rm 'dist1/sdf.html'
rm 'dist1/up.html'

複製代碼

cat-file

git cat-file 命令能夠查看一個Git對象的類型和對象內容

git cat-file -t 對象引用名或SHA1 ,查看對象類型;

git cat-file -p 對象引用名或SHA1 查看對象內容

$git cat-file -t HEAD
commit
$git cat-file -t HEAD^{tree}
tree

➜  notify git:(master) ✗ git cat-file -p HEAD 
tree 7676819607cc8c2b0310dbc0f90a7d3789f2e300
parent 44842943fc03c341e7ec98e909de9cae9f814d22
author gaopo <gaopo@demo.com> 1554785677 +0800
committer gaopo <gaopo@demo.com> 1554785677 +0800

不限部門

$git cat-file -p e6361ed
複製代碼

rev-parse

git rev-parse 能夠查看一個引用名字所對應的提交SHA1哈希值

$git rev-parse HEAD
e6361ed35aa40f5bae8bd52867885a2055d60ea2
$git rev-parse master
e6361ed35aa40f5bae8bd52867885a2055d60ea2
$git rev-parse refs/heads/master
e6361ed35aa40f5bae8bd52867885a2055d60ea2
$git rev-parse v1.0
baa10bc4dc2ba6ff13e0bd0cdd50d8e9d36564a8
$git rev-parse origin/master
e6361ed35aa40f5bae8bd52867885a2055d60ea
複製代碼

別名

查看別名設置:

# 用 alias gcm 查看該別名設置:
➜  ~ alias gcm
gcm='git checkout master'



# 或者用shell 命令type
➜  ~ type gaa
gaa is an alias for git add --all

複製代碼

查看當前 SHELL

➜  ~ env
SHELL=/bin/zsh
ZSH=/Users/gaopo/.oh-my-zsh
複製代碼

~/.zshrc 設置別名

由於用的是 zsh ,就在 ~/.zshrc

alias gpull="git pull origin"
alias gpush="git push origin"
alias gs="git status"

alias npmr="npm run dev"
alias npmb="npm run build"
alias npms="npm run server"
alias wsm="webstorm"   # webstorm 編輯器的別名
複製代碼

zsh 安裝了 oh-my-zsh,自帶了一個 git 插件

cd ~/.oh-my-zsh/plugins/git
ls
README.md      git.plugin.zsh
複製代碼

git.plugin.zsh 裏面的內容有特別多的別名設置

# Aliases
# (sorted alphabetically)

alias g='git'
alias ga='git add'
alias gaa='git add --all'
alias gapa='git add --patch'
alias gau='git add --update'
alias gb='git branch'
。。。
...

複製代碼

更新下配置文件

source ./zshrc
複製代碼

關注我,更多好文奉上!!!

相關文章
相關標籤/搜索