Git 的非常規(guī)操作

git

緣起

之前按照教程系統(tǒng)學(xué)習(xí)了git, 自以為掌握, 但是在實際工作中卻發(fā)現(xiàn)許多超出普通教程的操作需求.


忽略某些文件

情境

某些文件不需要納入git進行管理, 比如緩存文件, 比如用于本地測試的設(shè)置

解決

創(chuàng)建一個.gitignore文件, 列出需要忽略的文件, 其配置語法是:

  • 以斜杠/開頭表示目錄;
  • 以星號*通配多個字符, 比如*.DS_Store 表示忽略所有以.DS_Store結(jié)尾的文件;
  • 以問號?通配單個字符;
  • 以方括號[]包含單個字符的匹配列表;
  • 以嘆號!表示不忽略某個特定文件或目錄;

注意

  • .gitignore是從上到下進行規(guī)則匹配的, 也就是說如果前面的規(guī)則匹配的范圍更大, 則后面的規(guī)則將不會生效;
  • 設(shè)置"文件夾忽略"時要注意: /myDir/*表示忽略根目錄下的"myDirname"文件夾, 如果是myDir/*則表示只要文件夾名字是"myDirname", 不管它是在根目錄, 還是其它層次(比如/parentDir/myDir/*)都會被忽略!
  • 如果在開發(fā)過程中, 需要修改忽略列表, 會發(fā)現(xiàn)沒有生效, 那是因為.gitignore對已經(jīng)被 track 的文件是無效的登颓,換句話說, 如果文件已經(jīng)被納入 git 版本管理顶瞒,則修改 .gitignore 是無效的.
    解決辦法是先把本地緩存刪除, 使其變成 "未 track" 的狀態(tài), 然后再提交. 注意, 執(zhí)行這項操作要非常謹慎! 因為很可能發(fā)生這種情況: 如果之前設(shè)置了錯誤的忽略規(guī)則, 因為沒有生效, 所以沒有對項目造成影響, 但是讓這些錯誤規(guī)則真的生效, 會破壞項目! 第一, 要反復(fù)檢查 '.gitignore' 規(guī)則; 第二, 執(zhí)行這項操作后, 在提交到遠程倉庫之前, 要 git status 查看被影響的文件是否符合預(yù)期.

git rm -r --cached .
git add .
git commit -m '由于 .gitignore 無法忽略已經(jīng) track 的文件, 所以刪除緩存重新提交, 使 .gitignore 生效'

解決辦法是把本地緩存中打算忽略但是已經(jīng)被 track 的文件刪除, 使其變成 "未 track" 的狀態(tài).

git rm --cached <file>

暫存工作區(qū)的內(nèi)容

情境

在dev分支工作到一半, 但是需要緊急修復(fù)一個bug(需要從master中新建一個bug分支), 但是dev分支的工作進行到一半, 還沒到commit提交的程度.

解決

  1. 在dev分支中使用git stash將未完成的工作暫存起來(stash在英文中是"隱藏"的意思);
  2. 按照正常的步驟去修復(fù)bug -- 從master中新建一個bug分支, 然后修復(fù), 修復(fù)完后合并到master分支;
  3. 切換回dev分支, 使用git stash pop就可以將之前隱藏的修改恢復(fù)到dev分支了;

注意

如果是新增文件, 不能直接git stash, 必須先git add添加到緩存區(qū)(納入git版本管理)才可以.


讓 Git 跟蹤重命名的文件

情境

直接修改文件名, 會導(dǎo)致 Git 中的記錄是"刪除文件, 而重命名后的文件被當(dāng)作新增的文件".
那么如何讓 Git 跟蹤重命名的文件, 保持記錄的可追溯?

解決

使用 git mv 命令, 即 "move/移動"命令

比如, 要將 PosterModel.php 修改為 Poster.php:

git mv src/models/PosterModel.php src/models/Poster.php

拉取遠程倉庫的特定分支

情境

需要拉取公司遠程倉庫中的某一個特定分支.

解決

  1. 執(zhí)行git fetch, 將遠程倉庫的所有分支信息獲取到本地;
  2. 執(zhí)行git checkout -b local_branch_name origin/remote_branch_name將該遠程分支("origin/remote_branch_name")映射到本地名為"local-branchname"的分支;
  3. 之后再執(zhí)行拉取git pull origin local-branchname

(PS. 執(zhí)行git fetch后, 可以使用git branch -r查看拉取到本地的所有分支名稱)


刪除遠程倉庫的分支

情境

因為 Git "分支"功能強大易用, 也間接導(dǎo)致公司遠程倉庫的分支非常多, 而其中大部分分支是已經(jīng)開發(fā)完畢, 可以廢棄的.

解決

git push origin --delete <branchName>, 比如git push origin --delete dev_msg

PS. 刪除 tag 也是類似的: git push origin --delete <tagName>


克隆時的文件夾層次問題

情境

git clone時會以項目名稱建立文件夾, 比如公司的遠程倉庫名稱是"OwnerName/RepoName", 克隆后會在當(dāng)前文件夾新建一個"RepoName"的文件夾.
如何把代碼直接放在根目錄, 而不是新建并且放在"RepoName"文件夾下呢?

解決

git clone后面加上./, 比如git clone https://git.oschina.net/xxxx/xxxx.git ./


commit時如何書寫message

情境

(如題)

(部分)解決

暫時還沒有形成系統(tǒng)的解決辦法, 不過有2個心得:

  1. 團隊協(xié)助時, 用戶名稱要修改成自己的名字, 方便別人識別;
    之前使用 "patiencing" 做為 git 上的用戶名, 在閱讀 git 記錄時發(fā)覺識別度很低, 可以預(yù)見別人看到這個名字時的困惑 -- 查看 git 記錄時無法第一時間得知是誰修改了代碼.
    之后改為了自己的真實名字 git config --global user.name yourrealname (PS. 如果你不想全局修改, 只要去掉 --global , 也就是執(zhí)行 git config user.name yourname, 則只修改當(dāng)前 git 倉庫的用戶名)

  2. 在 commit 的 message 頭部添加"代碼修改范圍"和"代碼修改類別", 方便別人和自己查閱 Git 記錄時能夠很快理解代碼修改的目的.
    個人使用并且試驗有效的分類是:

    • [@優(yōu)惠券#修補] (表示本次提交是針對"優(yōu)惠券",任務(wù)類型是修補Bug,而 message 描述建議是對 Bug 的具體情形)
    • [@優(yōu)惠券#排版] (用于調(diào)整縮進等排版, 方便閱讀; 不涉及功能性變動)
    • [@優(yōu)惠券#新增]
    • [@優(yōu)惠券#刪除]
    • [@優(yōu)惠券#修改]
    • [@優(yōu)惠券#體驗] (優(yōu)化用戶體驗)
    • [@優(yōu)惠券#優(yōu)化] (優(yōu)化代碼, 重構(gòu), 刪除冗余代碼)

撤銷之前的操作

情境

后悔, 需要撤銷之前的操作.

解決

  1. 想要撤銷"工作區(qū)"中的修改
    可以使用git checkout -- /path/file來撤銷指定文件的工作區(qū)的修改, 恢復(fù)到上一次commit的狀態(tài)
    (PS. 可以執(zhí)行git checkout -- .來撤銷當(dāng)前工作文件夾的所有變動)
  2. 想要撤銷已經(jīng)add提交到了緩存區(qū)的修改
    先用git reset HEAD /path/file將文件從緩存區(qū)重新放回工作區(qū)
    再執(zhí)行git checkout -- /path/file撤銷該文件的修改
  3. 想要修改commit的"message"
    如果commit后沒有進行新的commit, 可以直接使用git commit --amend對上一次的message進行修改
  4. 撤銷意外添加到緩存區(qū)的文件
    類似上文中在開發(fā)過程中更新".gitignore"的操作:
git rm --cached -r dir

作用是刪除緩存區(qū)中的文件
(PS. --cached表示"git的緩存", -r等于"recursive/遞歸", 表示遞歸刪除文件夾中的所有文件)


查看指定文件的版本記錄

情境

想查看某個指定文件的修改記錄

解決

git log <file>

比如

git log config/database.php

題外

之前從事的是傳統(tǒng)行業(yè)的設(shè)計工作, 使用"給文件名添加版本或者日期 / 文件封面的版本記錄以及扉頁的版本更新說明 / 云霧線 / 公用盤 ..."來進行版本控制 (大型工程公司也有在使用專業(yè)的文件管理系統(tǒng)來解決版本控制問題; 之前和英國的工程公司合作, 對方使用的就是這種系統(tǒng), 我的體會就是"異常嚴謹, 同時操作反人性, 異常難用")

現(xiàn)在轉(zhuǎn)行到程序員, 用著 git 這個版本管理工具, 回首以前面對版本控制的痛苦, 不得不感慨"程序員這個行業(yè)雖然辛苦, 但是更容易享受到工作帶來的"心流 flow ".


參考文章

StackOverflow - How to make Git “forget” about a file that was tracked but is now in .gitignore?


文章歷史

  • 2016.12.14 (第一次發(fā)布)
  • 2017.03.04 增加"刪除遠程倉庫的分支"
  • 2017.03.09 增加對"刪除 git 緩存重新提交, 使中途修改的 .gitignore 生效"的操作的風(fēng)險提醒
  • 2017.03.09 修改"使中途修改的 .gitignore 生效"的操作, 從刪除全部緩存, 更新為刪除指定文件的緩存, 杜絕風(fēng)險
  • 2017.03.10 增加"查看指定文件的版本記錄"
  • 2017.03.17 增加"讓 Git 跟蹤重命名的文件"
  • 2017.04/30 修改"commit時如何書寫message", commit message 頭部增加"范圍"和"類別"
  • 2017.05.03 修改潤色

如果你覺得我的文章對你有用, 請打個"喜歡", 或者給些改進的建議 _

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冷溃,一起剝皮案震驚了整個濱河市捏顺,隨后出現(xiàn)的幾起案子腔丧,更是在濱河造成了極大的恐慌钞楼,老刑警劉巖鸿竖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煮盼,死亡現(xiàn)場離奇詭異凄吏,居然都是意外死亡远舅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門竞思,熙熙樓的掌柜王于貴愁眉苦臉地迎上來表谊,“玉大人,你說我怎么就攤上這事盖喷”欤” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵课梳,是天一觀的道長距辆。 經(jīng)常有香客問我,道長暮刃,這世上最難降的妖魔是什么跨算? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮椭懊,結(jié)果婚禮上诸蚕,老公的妹妹穿的比我還像新娘。我一直安慰自己氧猬,他們只是感情好背犯,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盅抚,像睡著了一般漠魏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妄均,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天柱锹,我揣著相機與錄音哪自,去河邊找鬼。 笑死禁熏,一個胖子當(dāng)著我的面吹牛壤巷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匹层,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼隙笆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了升筏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤瘸爽,失蹤者是張志新(化名)和其女友劉穎您访,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剪决,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡灵汪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柑潦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片享言。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渗鬼,靈堂內(nèi)的尸體忽然破棺而出览露,到底是詐尸還是另有隱情,我是刑警寧澤譬胎,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布差牛,位于F島的核電站,受9級特大地震影響堰乔,放射性物質(zhì)發(fā)生泄漏偏化。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一镐侯、第九天 我趴在偏房一處隱蔽的房頂上張望侦讨。 院中可真熱鬧抚笔,春花似錦任洞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怜俐。三九已至,卻和暖如春邓尤,著一層夾襖步出監(jiān)牢的瞬間拍鲤,已是汗流浹背贴谎。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留季稳,地道東北人擅这。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像景鼠,于是被迫代替她去往敵國和親仲翎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

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

  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,458評論 1 26
  • 本文為 Git教程的學(xué)習(xí)筆記铛漓,教程源自廖雪峰的博客溯香。這是一個由淺入深,學(xué)完后能立刻上手的Git教程浓恶。另玫坛,附上另一本...
    七弦桐語閱讀 6,240評論 5 47
  • 2017.11.20#手機圈那些事##檸檬智能學(xué)院# 各位朋友,大家早上好包晰!這里是今天的手機圈那些事湿镀,下面為您播報...
    AbbeyD0117閱讀 87評論 0 0
  • 問題描述 每次android studio升級gradle都會卡住,國內(nèi)下載真是慢到不行伐憾,不小心點了的話勉痴,等待的將...
    LeonXtp閱讀 661評論 0 0
  • 1、草是潮濕的树肃,花是潮濕的蒸矛,風(fēng)車是潮濕的,房屋是潮濕的扫外,牛是潮濕的莉钙,鳥是潮濕的……世界萬物都還是潮濕的。 2筛谚、一切...
    涼薄念暖閱讀 792評論 0 0