GIT使用(整理)

這篇東西是根據(jù)我以前寫的思維導(dǎo)圖整理得來的,大致收集了幾種場景以供不時之需谒麦。

簡要介紹

工作區(qū)和暫存區(qū)的定義

首先我們來看一下git的基本目錄結(jié)構(gòu)俄讹,在你轉(zhuǎn)換一個普通目錄以前,是看不到.git文件夾的绕德,git init 之后就會產(chǎn)生患膛,Linux或者M(jìn)ac下屬于隱藏文件夾,在Windows下容易Ctrl+A隨手就刪掉了耻蛇,刪除時留心一下踪蹬。

  • 工作區(qū)(Working Directory):就是你在電腦里能看到的目錄
  • 版本庫(Repository):工作區(qū)有一個隱藏目錄.git,這個不算工作區(qū)臣咖,而是Git的版本庫跃捣。
    Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū)夺蛇,還有Git為我們自動創(chuàng)建的第一個分支master疚漆,以及指向master的一個指針叫HEAD。

HEAD指針

在Git中,用HEAD表示當(dāng)前版本娶聘,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一樣)灵临,上一個版本就是HEAD^,上上一個版本就是HEAD^^趴荸,當(dāng)然往上100個版本寫100個^比較容易數(shù)不過來儒溉,所以寫成HEAD~100

當(dāng)執(zhí)行g(shù)it reset命令時发钝,git會把老的HEAD拷貝到文件.git/ORIG_HEAD中顿涣,在命令中可以使用ORIG_HEAD引用這個commit.

常用命令

  • git status 查看當(dāng)前狀態(tài)
  • git add 把文件修改添加到暫存區(qū)
# 單獨添加文件
git add README
# 添加所有更改的文件
git add .
  • git commit 把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支
# 在add完之后使用,提交修改
git commit -m "注釋"
# 將在跟蹤中的文件一次性提交
git commit -a -m "注釋"
# 使用上一次的提交信息重新提交
git commit -a -c
  • git diff
# 對比工作區(qū)和版本庫里面最新版本
 git diff HEAD -- filename
  • git reset

不同參數(shù)的說明:

A. --hard:重設(shè)(reset) index和working directory酝豪,自從<commit>以來在working directory中的任何改變都被丟棄涛碑,并把HEAD指向<commit>。

B. --soft:index和working directory中的內(nèi)容不作任何改變孵淘,僅僅把HEAD指向<commit>蒲障。這個模式的效果是,執(zhí)行完畢后瘫证,自從<commit>以來的所有改變都會顯示在git status的"Changes to be committed"中揉阎。

C. --mixed:僅reset index,但是不reset working directory背捌。這個模式是默認(rèn)模式毙籽,即當(dāng)不顯示告知git reset模式時,會使用mixed模式毡庆。這個模式的效果是坑赡,working directory中文件的修改都會被保留,不會丟棄么抗,但是也不會被標(biāo)記成"Changes to be committed"毅否,但是會打出什么還未被更新的報告。

D.--merge:避免在回滾時清除working tree

E. --keep:把在某一版本之后的commit清除掉蝇刀,但是保持working tree不變

  • git log
# 單行 精簡顯示commit記錄
git log --pretty=oneline --abbrev-commit

還有一些美化的用法螟加,可以百度一下。這里不講了


接下來講一下熊泵,使用git開發(fā)的各種情景仰迁。在搭建好git環(huán)境以后,可以針對各種情景快速熟悉git操作顽分。

情景一: 創(chuàng)建版本庫

如果你已經(jīng)有一個項目文件夾或者創(chuàng)建一個空文件夾,進(jìn)入文件夾創(chuàng)建本地Git倉庫來進(jìn)行版本管理施蜜。

# 創(chuàng)建文件夾
mkdir floder
# 進(jìn)入文件夾
cd floder
# git初始化
git init

或者你可以clone一個遠(yuǎn)程倉庫到本地卒蘸。

# 存在遠(yuǎn)程倉庫,從遠(yuǎn)程拷貝
git clone git@github.com:michaelliao/gitskills.git
# 關(guān)聯(lián)到遠(yuǎn)程的空倉庫
git remote add origin git@github.com:michaelliao/learngit.git
# 將本地版本倉庫推送到遠(yuǎn)程倉庫
git push origin mater

情景二:提交修改

修改readme.txt文件之后,提交到本地倉庫缸沃。

# 添加readme.txt到緩存區(qū)
git add readme.txt
# 提交緩存區(qū)到版本庫的當(dāng)前支線
git commit -m "添加一個說明文件"

添加所有修改的文件恰起,提交到本地倉庫。

# 添加所有更改到緩存區(qū)
git add .
# 提交緩存區(qū)到版本庫的當(dāng)前支線
git commit -m "注釋"

跳過暫存趾牧,直接提交所有修改到本地倉庫检盼。

# 直接提交本地的修改到當(dāng)前支線
git commit -a -m "注釋"

情景三:撤銷文件最近一次修改

常常發(fā)現(xiàn)自己錯誤的修改了一下文件,而它偏偏又commit了翘单,除了查看修改進(jìn)行恢復(fù),還可以直接恢復(fù)吨枉。

# 從暫存或者版本庫恢復(fù)到修改前
git checkout -- readme.txt

readme.txt自修改后還沒有被放到暫存區(qū),現(xiàn)在哄芜,撤銷修改就回到和版本庫一模一樣的狀態(tài)貌亭;

readme.txt已經(jīng)添加到暫存區(qū)后,又作了修改认臊,現(xiàn)在圃庭,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。

git checkout -- file命令中的--很重要失晴,沒有--剧腻,就變成了“創(chuàng)建一個新分支”的命令

情景四:發(fā)現(xiàn)當(dāng)前的修改已經(jīng)背離原意,一切回到當(dāng)前版本

# 放棄當(dāng)前工作區(qū)以及緩存區(qū)的修改涂屁,恢復(fù)到當(dāng)前版本
git reset --hard HEAD

情景五:發(fā)現(xiàn)之前的提交都是錯誤的恕酸,回到正確的版本

# 放棄當(dāng)前工作區(qū)以及緩存區(qū)的修改,恢復(fù)到上一個版本
git reset --hard HEAD^
# 放棄當(dāng)前工作區(qū)以及緩存區(qū)的修改胯陋,恢復(fù)到上上個版本
git reset --hard HEAD^^
# 放棄當(dāng)前工作區(qū)以及緩存區(qū)的修改蕊温,恢復(fù)到特定版本
git reset --hard SHA1

情景六:并行開發(fā)

# 從當(dāng)前分支中新建分支feature1-1,并切換到feature1-1分支
git checkout -b  feature1-1
# 開發(fā)..
...
# 各種commit 之后,回到master分支
git checkout master
# 將feature1-1分支合并到master分支(合并分支時,如果可能遏乔,Git會用Fast forward模式义矛,
# 但這種模式下,刪除分支后盟萨,會丟掉分支信息;git log 看不到分支的提交歷史)
git merge feature1-1
# 從當(dāng)前分支中新建分支feature1-1,并切換到feature1-1分支
git checkout -b  feature1-1
# 開發(fā)..
...
# 各種commit 之后,回到master分支
git checkout master
# 將feature1-1分支合并到master分支(請注意--no-ff參數(shù)凉翻,表示禁用Fast forward:)
git merge --no-ff -m "merge with no-ff" feature1-1
# 將feature1-1分支的文件filename檢出到當(dāng)前分支
git checkout feature1-1 -- filename

情景七:發(fā)現(xiàn)最近的幾次提交不屬于當(dāng)前支線,應(yīng)該另辟一條支線

# 創(chuàng)建新的分支feature
git branch feature1
#放棄當(dāng)前分支的3次版本修改
git reset --hard~3
#切換到feature1分支繼續(xù)開發(fā)
git checkout feature1

情景八:提交之后捻激,發(fā)現(xiàn)代碼沒有完整提交制轰,想重新編輯后提交

# 最近一次提交代碼到版本庫
        git commit ...
# 保持working tree不變,回到上一個版本
git reset --soft HEAD^
# 修改文件
...
# 重新使用之前那次commit的注釋胞谭、作者垃杖、日期等信息,
# 把所有修改、刪除的文件(不含未跟蹤文件)重新提交.
git commit -a -c ORIG_HEAD

情景九:放棄最近的幾個版本丈屹,需要記錄此次改變

# 放棄最近的三個版本,并生成一次commit
git revert HEAD~3
# 放棄最近的第五個到第二個(不包含)调俘,但不自動生成commit伶棒,僅僅修改index和working tree
git revert -n master~5..master~2

情景十:完成分支開發(fā),刪除分支

# 刪除本地分支
git branch -d  feature1-1
# 刪除遠(yuǎn)程分支
git branch -D feature1-1

情景十一:標(biāo)簽的使用

# 在當(dāng)前支線的最近commit上打上"v1.0"的標(biāo)簽
git tag v1.0
# 在SHA1對應(yīng)的commit上打上"v1.0"的標(biāo)簽
git tag v1.0 SHA1
# 查看標(biāo)簽V1.0的信息
git show v1.0

情景十二:當(dāng)前開發(fā)工作還不能提交到版本庫彩库,但迫切開啟fixbug支線

# 保存當(dāng)前工作空間進(jìn)棧
git stash
# 切換到主線肤无,工作區(qū)的內(nèi)容丟失
git checkout master
# 進(jìn)行修復(fù)工作
...
# 重新切換到之前的支線dev
git checkout dev
# 列出棧中內(nèi)容
git stash list
# 工作區(qū)的內(nèi)容出棧
git stash pop
git stash apply stash@{0}
git stash drop stash@{0}

情景十三:多庫項目獨立管理

# url:項目路徑 path:本地路徑
git submodule add url path
# 模塊列表
git submodule
# 第一次導(dǎo)入項目需要初始化
git submodule init
# 更新所有的模塊
git submodule update
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市骇钦,隨后出現(xiàn)的幾起案子宛渐,更是在濱河造成了極大的恐慌,老刑警劉巖眯搭,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窥翩,死亡現(xiàn)場離奇詭異,居然都是意外死亡坦仍,警方通過查閱死者的電腦和手機(jī)鳍烁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來繁扎,“玉大人幔荒,你說我怎么就攤上這事∈崦担” “怎么了爹梁?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長提澎。 經(jīng)常有香客問我姚垃,道長,這世上最難降的妖魔是什么盼忌? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任积糯,我火速辦了婚禮,結(jié)果婚禮上谦纱,老公的妹妹穿的比我還像新娘看成。我一直安慰自己,他們只是感情好跨嘉,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布川慌。 她就那樣靜靜地躺著,像睡著了一般祠乃。 火紅的嫁衣襯著肌膚如雪梦重。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天亮瓷,我揣著相機(jī)與錄音琴拧,去河邊找鬼。 笑死寺庄,一個胖子當(dāng)著我的面吹牛艾蓝,可吹牛的內(nèi)容都是我干的力崇。 我是一名探鬼主播斗塘,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼赢织,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了馍盟?” 一聲冷哼從身側(cè)響起于置,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贞岭,沒想到半個月后八毯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡瞄桨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年话速,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芯侥。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡泊交,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出柱查,到底是詐尸還是另有隱情廓俭,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布唉工,位于F島的核電站研乒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏淋硝。R本人自食惡果不足惜雹熬,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谣膳。 院中可真熱鬧竿报,春花似錦、人聲如沸参歹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽犬庇。三九已至僧界,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臭挽,已是汗流浹背捂襟。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留欢峰,地道東北人葬荷。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓涨共,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宠漩。 傳聞我的和親對象是個殘疾皇子举反,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

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