你應(yīng)該掌握的Git常用操作

獲取與創(chuàng)建項目

  • 創(chuàng)建倉庫的途徑有:
    1. 在本地已有的目錄,初始化一個新的蔚鸥;
    2. 克隆復(fù)制一份別人的項目动雹。

git init

  • 在當(dāng)前目錄下創(chuàng)建.git目錄,同時當(dāng)前目錄成為一個Git倉庫拿诸。

git clone

  • git clone Git倉庫url:將http或ssh鏈接指向的Git倉庫拷貝到本地扒袖。
  • git clone Git倉庫url 本地目錄路徑:將遠(yuǎn)程Git倉庫拷貝到本地指定目錄。

添加與提交

基本流程

  1. 使用git add添加需要追蹤的新文件和待提交的更改亩码;
  2. 使用git statusgit diff查看有何改動季率;
  3. 使用git commit提交快照。

git add

  • git add 文件:將文件添加到緩存區(qū)描沟,該文件被標(biāo)記為被追蹤飒泻。
  • git add .:緩存當(dāng)前目錄下所有文件,不包括已刪除的文件吏廉。

  • 注意泞遗,git add只是復(fù)制一份當(dāng)前狀態(tài)下的該文件到緩存區(qū),該文件之后的修改若不重新git add席覆,則提交的時候史辙,只會將上次git add的緩存提交給倉庫。

git commit

  • 將緩存寫入倉庫中。

  • git add工作區(qū)->緩存區(qū)髓霞,git commit緩存區(qū)->倉庫卦睹。

  • git commit -m "本次提交說明":一次性將緩存區(qū)所有文件修改提交到倉庫的當(dāng)前分支。

  • git commit -am "本次提交說明":自動把所有已經(jīng)跟蹤過的文件緩存方库,并提交到倉庫结序。常用于跳過git add步驟快速提交。

  • git commit --amend "本次提交說明":重新提交纵潦。此次提交代替上一次提交的結(jié)果徐鹤。尤其適用于提交完了才發(fā)現(xiàn)漏掉了幾個文件沒有添加,或者提交信息寫錯了的情況邀层。

git status

  • git status:顯示當(dāng)前倉庫的最新狀態(tài)返敬。

  • git status -s:當(dāng)前倉庫的最新狀態(tài)的簡介。

    git status -s
    • 狀態(tài)值第一欄是關(guān)于緩存區(qū)的(綠色)寥院,第二欄是關(guān)于工作區(qū)的(紅色)劲赠。
      • ??表示該文件僅是本地文件。
      • 綠色A表示該文件以前沒被提交過秸谢,添加到緩存凛澎;(提交時會告知倉庫添加此快照)。
      • 綠色M表示該文件以前被提交過后估蹄,又添加到緩存塑煎;(提交時會告知倉庫修改此快照)。
      • 綠色D表示該文件以前被提交過后臭蚁,被本地刪除了最铁,又刪除緩存;(提交時會告知倉庫刪除此快照)垮兑。
      • 綠色R表示該文件添加到快照時冷尉,系統(tǒng)發(fā)現(xiàn)某個D快照與其相同,并將D文件名改為該文件名系枪。
      • 紅色M表示該文件被本地修改過网严。
      • 紅色D表示該文件被本地刪除了。

git diff

  • git diff:比較工作區(qū)和緩存區(qū)的不同嗤无。
  • git diff --cached:比較緩存區(qū)和倉庫的不同震束。
  • git diff 文件:比較指定文件在工作區(qū)和緩存區(qū)的不同。
  • git diff 文件 --cached:比較指定文件在緩存區(qū)和倉庫的不同当犯。

  • git diff 提交版本號1 提交版本號2:比較兩次提交之間的區(qū)別垢村。
  • git diff 分支1 分支2:比較兩個分支之間的區(qū)別。

  • 注意:只會比較那些跟蹤文件(即git add過的文件)嚎卫。

git show

  • git show:查看最后一個提交的內(nèi)容嘉栓。
  • git show HEAD~1:查看倒數(shù)第二個提交的內(nèi)容宏榕。
  • git show 提交版本號:查看指定提交的內(nèi)容。

刪除與恢復(fù)

git rm

  • 主要用于從版本庫中刪除文件侵佃。

  • git rm 文件:把文件從版本庫中刪除麻昼,不再跟蹤。

  • git rm log/\*.log:將log目錄下擴展名為.log的所有文件從版本庫中刪除馋辈,不再跟蹤抚芦。通常適用于不小心把一些編譯、日志迈螟、debug文件錯誤提交到版本庫叉抡。


  • git rm -f 文件:當(dāng)文件有未提交的緩存區(qū)修改時,直接使用git rm 文件會報錯答毫。此時執(zhí)行此命令可強制將文件從緩存區(qū)和版本庫中刪除褥民。

  • git rm --cached 文件:把文件從版本庫中刪除,但讓文件保留在工作區(qū)且不被Git繼續(xù)跟蹤洗搂。通常適用于rm文件之后把其添加到.gitignore中消返。

恢復(fù)

  • git checkout -- 文件:丟棄工作區(qū)的修改。此文件必須是Git跟蹤的耘拇。
    1. 修改后仍未放到緩存區(qū)撵颊,恢復(fù)到上一次git commit的狀態(tài)。
    2. 添加到緩存區(qū)后又做了修改驼鞭,恢復(fù)到上一次git add的狀態(tài)。

  • git reset HEAD 文件:丟棄緩存區(qū)的修改尺碰,回退到工作區(qū)挣棕。

  • git reset --hard:重置所有文件到上次commit的狀態(tài)。
  • git reset --hard HEAD~1:將當(dāng)前分支重置為倒數(shù)第2個版本亲桥。
  • git reset --hard 提交版本號:將當(dāng)前分支重置為指定版本洛心。

版本控制

版本號

  • Git的版本號是SHA1校驗和,而不是用遞增的1题篷、2词身、3……,因為分布式的版本控制系統(tǒng)要確保每個用戶的修改記錄都是唯一的番枚,不會發(fā)生版本號沖突的情況法严。

  • HEAD表示當(dāng)前版本,HEAD^表示上一個版本葫笼,HEAD~100表示往上100個版本深啤。

git log

  • git log:顯示從最近到最遠(yuǎn)的提交日志。包含每個提交的SHA1校驗和路星、作者的名字和郵箱溯街、提交時間以及提交說明等。
  • git log --onelinegit log的簡要版
  • git log --decorate:不僅輸出git log的信息,還帶標(biāo)簽等額外信息呈昔。
  • git log --graph 不僅輸出git log的信息挥等,還可查看當(dāng)前分支什么時候出現(xiàn)了分支、合并堤尾。

  • git log 分支名:查看指定分支的提交日志肝劲。
  • git log 要查看的分支名branchA ^要忽略的分支名branchB:查看branchA的日志信息(排除branchB的信息)

git reflog

  • 記錄每一次的版本改動。包括commit記錄哀峻、reset版本退回記錄涡相。

git tag

  • git tag:查看所有標(biāo)簽。注意:標(biāo)簽不是按時間列出剩蟀,而是按字母排序催蝗。
  • git show <tag-name>:查看指定標(biāo)簽的信息。

  • git tag <tag-name> <commit-id>:在指定版本號上打上標(biāo)簽育特。

  • git checkout <tag-name>:切換到指定標(biāo)簽丙号。

  • git push --tags:將標(biāo)簽推送給遠(yuǎn)程倉庫。

遠(yuǎn)程項目

git remote

  • git remote add <shortname> <url>:添加并關(guān)聯(lián)一個遠(yuǎn)程庫缰冤。shortname一般為origin犬缨。
    1. 以http方式添加

      git remote add origin https://github.com/daking1991/GitTest.git
      
    2. 以ssh方式添加

      git remote add origin git@github.com:daking1991/GitTest.git
      

  • git remote:查看已配置的遠(yuǎn)程倉庫,列出各遠(yuǎn)程倉庫的shortname棉浸。

  • git remote -v:查看已配置的遠(yuǎn)程倉庫的讀寫url怀薛。

    // git remote -v
    origin  git@github.com:daking1991/GitTest.git (fetch)
    origin  git@github.com:daking1991/GitTest.git (push)
    
  • git remote show <shortname>:查看shortname對應(yīng)的遠(yuǎn)程倉庫的fetch和push等詳細(xì)信息。

    * remote origin
        Fetch URL: git@github.com:daking1991/GitTest.git
        Push  URL: git@github.com:daking1991/GitTest.git
        HEAD branch: (unknown)
    

  • git remote rm <shortname>:移除指定的遠(yuǎn)程倉庫迷郑。

  • git remote rename <old_shortname> <new_shortname>:重命名一個遠(yuǎn)程倉庫的shortname枝恋。

git push

  • git push <remote-repo-shortname> <local-branch>:將本地分支推送到遠(yuǎn)程倉庫。

拉取

  • git pull <remote-shortname> <local-branch>:拉取遠(yuǎn)程倉庫最新提交嗡害,并合并到指定的本地分支上焚碌。

  • git fetch:拉取遠(yuǎn)程倉庫最新提交,但不會自動合并分支霸妹。

分支

git branch

  • git branch:列出本地分支列表十电。當(dāng)前分支前會標(biāo)有*號
  • git branch -r:列出遠(yuǎn)程分支列表叹螟。
  • git branch -a:列出所有分支列表鹃骂。

  • git branch 分支:創(chuàng)建新分支。
  • git branch -d 分支:刪除指定分支罢绽。

  • git branch -v -a:查看所有分支的最后一次提交偎漫。

git checkout

  • git checkout 分支:切換到指定分支。
  • git checkout -b 分支:創(chuàng)建并切換到指定分支有缆。

git merge

  • git merge 分支:將指定分支合并到當(dāng)前分支上象踊。

合并沖突

  • 不同分支修改了相同區(qū)塊的代碼時温亲,合并分支時git會將此部分標(biāo)記為沖突,需要用戶手動去修改杯矩。

    沖突文件內(nèi)容
  • 可用git diff查看沖突詳情

    沖突詳情
  • 可用git status -s查看沖突文件栈虚,狀態(tài)標(biāo)識為UU

    沖突文件
  • 手動修改后史隆,使用git add重新寫入緩存區(qū)魂务。

子模塊

  • 一個大型工程拆分為一些子工程。既有利于降低工程開發(fā)難度泌射,也有利于使用現(xiàn)成的方案或第三方方案作為子工程粘姜。

添加子模塊

  • 步驟

    1. 在某工程的根目錄下,執(zhí)行

      git submodule add git@git.oschina.net:daking/android-client-common.git
      
    2. 會多出一個.gitmodules文件熔酷,此為子模塊配置文件孤紧,其內(nèi)容為

      [submodule "android-client-common"] 
          path = android-client-common 
          url = git@git.oschina.net:daking/android-client-common.git 
      # 若有多個子模塊,則會有多個條目...
      
  • 指定submodule在父工程中的位置

    git submodule add git@git.oschina.net:daking/android-client-jni.git ./app/src/main/jni/api
    
  • 指定submodule要跟蹤的分支

    • submodule add添加的子模塊默認(rèn)是處于游離狀態(tài)的拒秘,并不處于任何分支上号显。

    • 可指定其要跟蹤的分支:

      1. git submodule add git倉庫路徑 -b 要跟蹤的分支名
      2. 或直接在.gitmodules配置文件中對應(yīng)子模塊下增加branch = 要跟蹤的分支名

clone一個帶子模塊的Git倉庫

  1. 方案1
    1. git clone Git倉庫路徑躺酒;
    2. 初始化以及更新子模塊:git submodule init押蚤,git submodule update
  2. 方案2
    git clone --recursive Git倉庫路徑 參數(shù)--recursive會遞歸初始化并更新每個子模塊羹应。

更新子模塊

  1. 先更新子模塊揽碘,git submodule update。若嵌套多層子模塊园匹,則git submodule foreach "git submodule update"雳刺。
  2. 再更新主倉庫。

子模塊的修改提交

  1. 在子模塊的根目錄下偎肃,切換到要修改的分支煞烫,再進(jìn)行代碼修改浑此。這是因為submodule的HEAD默認(rèn)是處于游離狀態(tài)累颂,它并沒在任何分支上。
  2. 在子模塊的根目錄進(jìn)行Git提交凛俱。
  3. 在主Git倉庫的根目錄進(jìn)行Git提交紊馏。

刪除子模塊

  1. 刪除子模塊的Git緩存,git rm --cached android-client-common/

  2. 刪除子模塊的本地文件蒲犬,rm -rf android-client-common/

  3. 刪除與此子模塊相關(guān)的配置

    rm -rf .git/modules/android-client-common/ 
    .gitmodules中的相關(guān)配置 
    .git/config中的相關(guān)配置
    
  4. 修改提交

    git add .gitmodules 
    git commit -m 'remove submodule: android-client-common' 
    git push 
    

git config

  • git config --list:列出所有配置信息朱监。
  • git config <key>:檢查關(guān)鍵字key的配置。如git config user.name原叮,查看姓名配置赫编。

  • git config --global alias.命令別名 命令:為指定命令配置一個別名巡蘸,可快速輸入命令。
    1. git config --global alias.unadd 'reset HEAD':使用git unadd 文件可丟棄指定文件在緩存區(qū)的修改擂送。

    2. git config --global alias.st status:使用git st代替git status悦荒。

    3. git config --global alias.co checkout:使用git co代替git checkout

    4. git config --global alias.cm commit:使用git cm代替git commit嘹吨。

    5. git config --global alias.br branch:使用git br代替git branch搬味。

    6. git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit":使用git lg輸出高逼格的日志信息。

      git lg輸出高逼格的日志
    7. git config --global alias.last 'log -1':使用git last顯示最近一次的提交蟀拷。

      git last查看最近一條日志

  • git config --global user.name "yourname"git config --global user.email "youremail":修改姓名和郵箱碰纬,去掉--global可針對每個repo單獨設(shè)定。

我的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末问芬,一起剝皮案震驚了整個濱河市悦析,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愈诚,老刑警劉巖她按,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異炕柔,居然都是意外死亡酌泰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門匕累,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陵刹,“玉大人,你說我怎么就攤上這事欢嘿∷ニ觯” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵炼蹦,是天一觀的道長羡宙。 經(jīng)常有香客問我,道長掐隐,這世上最難降的妖魔是什么狗热? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮虑省,結(jié)果婚禮上匿刮,老公的妹妹穿的比我還像新娘。我一直安慰自己探颈,他們只是感情好熟丸,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伪节,像睡著了一般光羞。 火紅的嫁衣襯著肌膚如雪绩鸣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天纱兑,我揣著相機與錄音全闷,去河邊找鬼。 笑死萍启,一個胖子當(dāng)著我的面吹牛总珠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勘纯,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼局服,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驳遵?” 一聲冷哼從身側(cè)響起淫奔,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堤结,沒想到半個月后唆迁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡竞穷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年唐责,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘾带。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鼠哥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出看政,到底是詐尸還是另有隱情朴恳,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布允蚣,位于F島的核電站于颖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嚷兔。R本人自食惡果不足惜森渐,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谴垫。 院中可真熱鬧章母,春花似錦母蛛、人聲如沸翩剪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽前弯。三九已至蚪缀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恕出,已是汗流浹背询枚。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留浙巫,地道東北人金蜀。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像的畴,于是被迫代替她去往敵國和親渊抄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

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