Git 基本命令

本文按照 設(shè)置工程批幌、分支與合并本地操作嗓节、分享和更新 四步來簡單說一下 Git 基本命令的用法。

注:git 命令如此之豐富,可以說代乃,不論你有什么需求贮预,遇到些什么問題你虹,通過查命令都可以解決卒暂。如果命令一時看不懂永淌,則 Google 一下或者直接上 stackoverflow,別人的做法會給你啟發(fā)无蜂。

一句話,有問題不是事兒。不但不是事兒螟够,反而是 get 新技能的契機萧福。

命令幫助

每個命令的 Examples 部分是一個很好的學(xué)習(xí)命令使用的示例。

使用 git 命令行?還是 GUI 工具秘蛇?

命令行對 git 所有命令都適用其做,也最安全顶考,不容易出問題;而圖形界面工具則不一定了妖泄,不過常用命令沒什么大問題驹沿。

設(shè)置運行環(huán)境

git config --global user.name "your name" ; 設(shè)置你的稱呼
git config --global user.email "your_email@example.com" ;設(shè)置你的郵箱浮庐;
git config --global push.default simple 甚负;This is the safest option and is suited for beginners. 在 git push 時不必指定 [<repository> [<refspec>...]]
git config --global core.quotepath false ;解決 Windows Git Bash审残、Linux 下的中文轉(zhuǎn)碼問題梭域;
git config --global core.editor /usr/bin/vim ;OS X 下 merge 命令 vi error 問題搅轿;通常 core.editor=vim病涨。
git config --global core.autocrlf true ;Win Git Bash 時設(shè)置璧坟,見 git replacing LF with CRLF既穆。
git config --unset ;清除設(shè)置項雀鹃。
git config --global credential.helper wincred 幻工;Win Git Bash 啟用 http/https 協(xié)議時設(shè)置。
git config -l 黎茎;查看所有的(name.key)/(value) -l | --list

設(shè)置工程(Clone repositories)
  • git clone ; 從遠程復(fù)制資源庫到本地庫囊颅。
    git clone <repository> [<directory>]
    1. repository:遠程庫地址;
    2. directory:本地目錄名傅瞻;不指定踢代,則默認為遠程庫名。如果目錄已存在則必須是一個空目錄嗅骄;
# ssh:// URL 形式胳挎,看起來和 https URL 形式相似。ssh 需要的私鑰文件在 ~/.ssh/config 文件中由 IdentityFile 參數(shù)指定溺森。
git clone ssh://user@gitserver/path/to/project.git 
# 示例:git clone ssh://192.168.99.236/home/git/wanpinghui/wphdoc.git
# scp-like 語法
git clone user@gitserver:/path/to/project.git 
# 示例:git clone 192.168.99.236:/home/git/wanpinghui/wphdoc.git
服務(wù)器的 git 庫約定以 .git 結(jié)尾慕爬,clone 后的工作區(qū)中的 git 庫則不包含 .git。
  • 設(shè)置 .gitignore 文件
    在該文件中儿惫,設(shè)置 commit 時要忽略的文件匹配模式澡罚,避免提交一些臨時文件到庫里。
# 在工程根目錄下建一個文件 .gitignore肾请,是一個受控文件。以下為文件內(nèi)容示例更胖。
# 忽略 PHP 臨時工作文件
.buildpath
.project
.settings/
# 忽略 Mac 臨時工作文件
.DS_Store
  • build和lib 實際上是空文件夾铛铁,保留.gitkeep僅為在 git 上受控隔显。
# cat .gitignore
build/*
!build/.gitkeep
lib/*
!lib/.gitkeep

git ls-files -o -i -X .gitignore 僅查看 ignored 的文件,匹配模式從 .gitignore 文件中獲榷稹(--others括眠,--ignored,--exclude-from)倍权。了解 git ls-files掷豺。
git status --ignored 也會列出 ignored 的文件;了解 git status薄声。
git ls-files -o --directory 可以查看非受控文件和目錄列表(--others)当船。

分支與合并(Create branches)
  • git branch ; 看本地當(dāng)前分支( local branches)情況,以及當(dāng)前工作區(qū)位于哪個分支默辨。
    git branch -r 看遠程跟蹤分支(remote-tracking branches)情況德频,--remotes。
    git branch -d <branch>缩幸;刪除 <branch>壹置,--delete;
    git branch -a 表谊;查看本地和遠程所有分支情況钞护,--all;
    git branch -m <new-branch-name>:修改當(dāng)前分支名爆办,詳見 How To Change Branch Name on Git难咕。

  • git checkout <branch> ;將工作區(qū)切換到分支押逼,這有點類似于 svn checkout步藕。master 也是一個分支。
    示例:git checkout v0.1 ; v0.1 表示分支名稱挑格。

  • git branch <new_branch> [<start-point>]; 在本地開分支咙冗。注意:僅僅開分支,并不自動將工作區(qū)切換到分支漂彤;[<start-point>] 表示從哪里開始分支雾消,默認指向當(dāng)前 HEAD;
    git branch v0.7e v0.7d挫望,表示 從 v0.7d 開一個新分支 v0.7e立润;

  • git checkout -b <new_branch> [<start-point>];開后即刻簽出媳板;

  • git merge(合并)
    Join two or more development histories together桑腮。

  • git reset --merge: 在 git merge iwifi 合并分支操作后,你發(fā)現(xiàn)有問題蛉幸,則執(zhí)行此句可立馬恢復(fù)所做的合并破讨。

  • git reset 恢復(fù)
    git reset [<commit>] 在沒有 push 前將本地庫恢復(fù)到指定 <commit>丛晦。

  • git log --name-status --oneline 常用命令

    可以查看變化的文件列表

  • git log --pretty=oneline|medium
    列出 commit 全值,以便類似于 svn 取出指定 revision提陶,甚至某一個文件:git checkout <commit> [path/file]烫沙。

  • git log --patch

  • git log --stat (列出簡略的統(tǒng)計數(shù)據(jù):abbreviated stats for each commit)

  • git shortlog

在工作區(qū)和本地庫操作(Basic Snapshotting | Commit changes)
  • git add ; 新文件或者本地修改了的文件,都需要 add隙笆。
  • git status
    git status -s ; Short Status
  • git commit
    git commit -m '注釋':--message
    git commit -uno:不要列出 untracked-files
    git commit -a -m '注釋'锌蓄;-a | --all 表示包含所有 modified and deleted files,但新文件需提前 git add撑柔。相比添加文件瘸爽,修改文件是個更常見動作,加 -a 參數(shù)即可省略 git add乏冀。
分享和更新(Share code)

將你的修改分享出去到遠程庫和從遠程庫更新到本地庫蝶糯。

  • git fetch(下載)
    Download objects and refs from another repository 從遠程主機將變更下載到本地,但不進行合并辆沦。
  • git push --set-upstream origin v0.1 ; set upstream for git pull/status, [-u | --set-upstream].
    Pushing to Your Remotes 將你本地的變更推送到遠程主機昼捍。多人協(xié)同開發(fā),請及時 push肢扯。
  • git pull [<repository> [<refspec>...]] (常用)
    Fetch from and integrate with another repository or a local branch 從遠程主機將變更取到本地庫妒茬,同時進行合并。pull 實際是把 fetch 和 merge 兩個命令的操作放到一個命令里了蔚晨。使用 pull 通常沒有太大問題乍钻。不過仍然建議分開使用 fetch and merge。
    示例:git pull origin v0.1 ; 從遠程 origin 的分支 v0.1 更新到本地庫
  • git remote -v

$ git remote --verbose
origin git@192.168.1.91:/path/to/wphdoc.git (fetch)
origin git@192.168.1.91:/path/to/wphdoc.git (push)

  • 遠程地址變化
    git remote set-url origin <新地址> 或者remove+add铭腕。
git tag
  • 打 Tag 是很容易的银择,tag 其實就是一個 commit 的別名;自然刪除 tag 也是極容易的累舷;
  • 打 Tag:git tag -m <tag name> [<commit>]
    • 其中 -m <msg> 表示 tag 備注浩考,每個tag都必須給出說明。多個 -m 就是多個段落被盈,對 tag 可以有了更詳細的描述析孽。
  • 推送到遠程:git push <remote> <tag name>
  • 對于 GitHub 來說,打了一個 Tag 就有了一個 Release只怎;
  • 在 GitHub 上通過自定義腳本袜瞬,可以同步更新 Packagist 上的 composer 包;
  • GitHub 上的 Release 的命名有類似 v1.8的身堡,也有 1.8邓尤,1.8-rc1 的;
文件對比 git diff

在開發(fā)中,經(jīng)常會修改文件裁赠,提交時或者 review 時也就經(jīng)常需要對比文件:

  • 工作區(qū)和庫中比對
  • 在不同 commit 間比對
  • 在不同 branch 間比對(branch 也是一個 commit殿漠,故也是 commit 比對)
  • git diff --name-only # 列出有變化的文件赴精;
    How to list only the file names that changed between two commits?
  • vim -p git diff --name-only
    vim 編輯所有有變化的文件佩捞,編輯時,一個文件一個tab蕾哟。
  • git diff HEAD
    See the difference between your current files and your last commit.
  • git diff --staged
    See the difference between your staged files and your last commit.
  • git stash
    Temporarily store changes in a "dirty" working directory.

使用 git diff 進行比對的可視化程度比較低一忱,不論 markdown(md) 文檔還是 code,都差強人意谭确。相反 git difftool 卻值得推薦帘营。

使用 git difftool

使用第三方的 difftool 來進行比對,我們選用 vimdiff 這個比對工具逐哈。vimdiff 一般就是一個 vim 的 link芬迄。也就是說 vim 編輯器本身是支持進行文件比對的。vim 是一個程序員絕對要熟悉的工具昂秃。

git config --global diff.tool vimdiff
git config --global merge.tool vimdiff
git config --global difftool.prompt false

difftool.prompt 關(guān)閉提示是必要的。你在執(zhí)行 git difftool 命令時肠骆,如果有多個待比對文件算途,則每次 vim 啟動比對時都詢問,你會感到不爽的蚀腿。關(guān)閉提示最好嘴瓤。當(dāng)然 git difftool --no-prompt 也可以。

git difftool .
git difftool <specific file>
git difftool <commit> [<commit>] [path]
git difftool HEAD^ # HEAD 和其前一次 commit 比對莉钙,即查看最新一次提交的修改記錄廓脆;
  • 比對時,查看不同點的快捷鍵
    [c 上一個不同點
    ]c 下一個不同點
關(guān)于導(dǎo)出代碼
  • git checkout-index磁玉;
  • Do a “git export” (like “svn export”)?
    直接導(dǎo)出純代碼停忿,不包含 .git 等歷史記錄和控制信息。
    git checkout-index -a -f --prefix=/destination/path/
    注意:path 后面必須有/蜀涨,作為最后一級目錄瞎嬉,path 必須未創(chuàng)建。如果 path 已經(jīng)創(chuàng)建或者path后面沒有/厚柳,就會簽出到 /destination/目錄下氧枣,簽出的文件和目錄以 path 作為前綴。
關(guān)于 checkout 的 examples(放棄修改别垮,重新簽出文件)

The following sequence checks out the master branch, reverts the Makefile to two revisions back, deletes hello.c by mistake, and gets it back from the index.

$ git checkout master                   **(1)**
$ git checkout master~2 Makefile        **(2)**
$ rm -f hello.c
$ git checkout hello.c                  **(3)**

(1) switch branch
(2) take a file out of another commit
(3) restore hello.c from the index

  • 簽出某一個 branch 或者 commit 下的 某個文件
    git checkout <branch|commit> [path/file]

  • 工作區(qū)的修改(放棄修改)
    git checkout <filename>:放棄指定文件便监;
    git checkout .:放棄所有修改;
    git checkout -- .:放棄當(dāng)前目錄及其子目錄下的修改;

  • 本地庫的修改
    如果文件已經(jīng)提交烧董,但尚未 push 到遠程毁靶,則 git reset <commit> 即可(這個commit 之后所做的修改都保留在工作區(qū),即默認 --soft逊移≡み海回滾到上次就是 git reset HEAD^),git reset --hard <commit> 則直接放棄所做修改(慎重)胳泉。

問題:Git cannot add a completely empty directory

Git 不支持加一個空目錄拐叉,原因是 Git 處理的是文件,Git 不把目錄作為對象進行處理扇商。建議你在空目錄下加一個 .gitignore 文件凤瘦,提交上去即可,那個目錄看起來是一個空目錄案铺。

# Ignore everything in this directory
*
# Except this file
!.gitignore
  1. How can I add an empty directory to a Git repository?
  2. Commit empty folder structure (with git)蔬芥。

注:如果你連 .gitignore 也不想加,通過 touch README.md 加一個零字節(jié)空文件也不是不行控汉。

使用 git fetch 查看遠程庫有否修改

有時候笔诵,你僅僅想 查看一下遠程庫有否修改,而不想對本地做任何更改暇番,使用 git fetch 即可嗤放。

$ git status
On branch v0.3
Your branch is up-to-date with 'origin/v0.3'.
nothing to commit, working directory clean

從以上 git status 的輸出可以看到,本地沒有變更壁酬。下面看一下 git fetch 的輸出:

$ git fetch --dry-run --verbose
POST git-upload-pack (957 bytes)
remote: Counting objects: 1194, done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 1194 (delta 13), reused 12 (delta 12), pack-reused 1170
Receiving objects: 100% (1194/1194), 9.05 MiB | 740.00 KiB/s, done.
Resolving deltas: 100% (751/751), completed with 7 local objects.
From https://github.com/w..p...h../web
   cc796ed..19cc48e  v0.3       -> origin/v0.3
 = [up to date]      master     -> origin/master

以上 git fetch 的輸出可以看到次酌,本地 v0.3 缺少從 cc796ed 直到 19cc48e 的 commits,即遠程庫有修改舆乔。

使用 git fetch 下載岳服,可以查看每次 commit 的修改記錄
$ git fetch origin v0.3
From https://github.com/w..p...h../web
 * branch            v0.3       -> FETCH_HEAD
   cc796ed..19cc48e  v0.3       -> origin/v0.3

$ git status
On branch v0.3
Your branch is behind 'origin/v0.3' by 133 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)
nothing to commit, working directory clean

$ git log FETCH_HEAD
(略) 你就能看到遠程庫所做的修改寺谤;

請區(qū)別 HEAD | origin/HEAD | origin/master:

  • git reset --hard HEAD
  • git reset --hard origin/HEAD
  • git reset --hard origin/master
關(guān)于 git log

Viewing the Commit History 了解 git log 比較容易鳞上。

  • --decorate: Print out the ref names of any commits that are shown.
  • --all: Pretend as if all the refs in refs/ are listed on the command line as <commit>.
  • git log --pretty=oneline --decorate --all -3
7055c613f081be5bd063d4695bbd2f9e593039bd (origin/v0.3, origin/HEAD) 修改個人信息頁
5e8668d78c92875d9efc5707f5fadb4a071f9b36 (HEAD -> v0.3) 為了遷就壓縮这吻,js統(tǒng)統(tǒng)放到dists目錄下
f2882da667ba6d3a83edd331c8e51317b053f9b5 @@include參數(shù)必須用雙引號,單引號發(fā)布失敗
HEAD -> v0.3 圖示
  • git log --name-status --oneline --decorate --graph --all
    查看所有分支情況篙议,簡單唾糯、清晰圖形標識分支怠硼;
  • git log --name-status -n 5 --pretty=format:"%an %ad %s"
    列出發(fā)生變更的文件的名字及其狀態(tài),限于 5 個 commits移怯,格式:author name, author date, subject香璃。這個和 svn 格式比較貼近。通過 git config --global format.pretty "%an %ad %s" 設(shè)置格式舟误。
如何搜索查看已刪除文件葡秒?

有時我們刪除了一個文件,但又記不起在哪個 commit 刪除的脐帝,怎么辦同云?

  • git log --all **/<filename>
    git log --all --name-status **/*<partoffilename>*
    --name-status 列出文件目錄,**/ 表示任意路徑堵腹;
  • Get a list of the deleted files and copy the full path of the deleted file.
    git log --diff-filter=D --summary | grep delete

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市星澳,隨后出現(xiàn)的幾起案子疚顷,更是在濱河造成了極大的恐慌,老刑警劉巖禁偎,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腿堤,死亡現(xiàn)場離奇詭異,居然都是意外死亡如暖,警方通過查閱死者的電腦和手機笆檀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盒至,“玉大人酗洒,你說我怎么就攤上這事〖纤欤” “怎么了樱衷?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酒唉。 經(jīng)常有香客問我矩桂,道長,這世上最難降的妖魔是什么痪伦? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任侄榴,我火速辦了婚禮,結(jié)果婚禮上网沾,老公的妹妹穿的比我還像新娘癞蚕。我一直安慰自己,他們只是感情好绅这,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布涣达。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪度苔。 梳的紋絲不亂的頭發(fā)上匆篓,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音寇窑,去河邊找鬼鸦概。 笑死,一個胖子當(dāng)著我的面吹牛甩骏,可吹牛的內(nèi)容都是我干的窗市。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼饮笛,長吁一口氣:“原來是場噩夢啊……” “哼咨察!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起福青,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤摄狱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后无午,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體媒役,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年宪迟,在試婚紗的時候發(fā)現(xiàn)自己被綠了酣衷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡次泽,死狀恐怖穿仪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情箕憾,我是刑警寧澤牡借,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站袭异,受9級特大地震影響钠龙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜御铃,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一碴里、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧上真,春花似錦咬腋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陵像。三九已至,卻和暖如春寇壳,著一層夾襖步出監(jiān)牢的瞬間醒颖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工壳炎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泞歉,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓匿辩,卻偏偏與公主長得像腰耙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子铲球,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

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

  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,456評論 1 26
  • 本文作者陳云峰挺庞,轉(zhuǎn)載請注明。 這篇文章記錄個人常用的一些命令睬辐,和記不住的一些命令挠阁,轉(zhuǎn)載了并不斷更新。 Git官網(wǎng) ...
    陳云峰閱讀 2,806評論 0 24
  • 今天孩子早早起床的第一件事就是讀拼音溯饵,她說今天老師要檢查的,看來孩子對學(xué)習(xí)的態(tài)度還是好的锨用,武校長說過丰刊,一年級的孩子...
    雅琳媽媽閱讀 170評論 0 0
  • 男朋友放我飛機,然后怎么調(diào)節(jié)心情呢增拥? 本來安排好的元旦過去找他啄巧,結(jié)果,他又有事情陪不了我掌栅,剛好元旦是例假期秩仆,我跑來...
    郭云閱讀 106評論 2 1
  • 很多公司都要求班組或者團隊,在開始工作前召開班組會或者班前會猾封,有的人對此不理解澄耍,覺得沒有必要,或者堅持了一段...
    認真斷舍離閱讀 1,802評論 0 0