Git基礎(chǔ)使用

git基本命令

  • 查看當(dāng)前文件的狀態(tài):git status
  • 從工作區(qū)提交到暫存區(qū):git add 文件名
  • 將暫存區(qū)的文件提交到倉庫:git commit -m "提交描述"

初始化git

當(dāng)git第一次安裝時(shí)需要初始化用戶名和郵箱

  • 設(shè)置用戶名:
    git config --global user.name '用戶名'
  • 設(shè)置用戶名郵箱
    git config --global user.email '郵箱地址'
該設(shè)置在github倉庫主頁顯示誰提交了該文件
  • 查看設(shè)置
    git config -list

初始化一個(gè)新倉庫

  • mkdir 文件夾名
  • 在文件內(nèi)初始化git
- 進(jìn)入到文件夾內(nèi):cd 文件夾名
- 初始化: git init
如此倉庫即在test里了

向倉庫中添加文件

  • 將文件從工作區(qū)添加到暫存區(qū)

刪除倉庫文件

  • 刪除工作目錄:rm -f 文件名
  • 從git中刪除文件 git rm 文件名
  • 提交修改:git commit -m '描述'

git分支

分支的創(chuàng)建查看及切換

當(dāng)使用git init的時(shí)候會(huì)初始化一個(gè)分支為master分支用押,但是這個(gè)分支只有提交一次之后才會(huì)生效,所以必須先寫點(diǎn)什么東西然后在提交,如果是空提交是不行的比如下面

$ git commit -m 'init commit'
On branch master

Initial commit

nothing to commit

此時(shí)master分支并沒有生效界睁,可以使用git branch命令查看所有分支

$ git branch
* master

只有看到這樣的結(jié)果才說明master分支生效了画舌。*代表當(dāng)前分支

創(chuàng)建分支和查看分支使用的是一個(gè)命令:

$ git branch test_branch #創(chuàng)建分支

$ git branch    #查看分支
* master
  test_branch

切換分支:

通過git checkout 分支名稱切換分支

$ git checkout test_branch
Switched to branch 'test_branch'

不同的分支在沒有合并之前是獨(dú)立的。

分支的重要操作

刪除分支

git branch -d 分支名稱

git不允許刪除當(dāng)前所處的分支

如果要?jiǎng)h除的分支并沒有完全被合并那么要?jiǎng)h除就需要使用 -D選項(xiàng)

git branch -D 分支名稱

創(chuàng)建分支并切換的簡(jiǎn)寫命令為:

git checkout -b 分支名

使用git checkout -可以回退切換分支,例如:

$ git checkout -b test_branch2
Switched to a new branch 'test_branch2'
#在使用git checkout - 即可回退到之前所處的分支
$ git checkout -
Switched to branch 'master'

使用git merge 分支名可以將指定的分支合并到當(dāng)前分支上

例如我在master分支上創(chuàng)建了一個(gè)文件名叫test_branch.txt內(nèi)容為:

this is master test_branch i want to merge test_branch2 branch file

然后再創(chuàng)建了一個(gè)叫test_branch2的分支在此分支上創(chuàng)建一個(gè)相同名稱的test_branch.txt內(nèi)容為:

this is test_branch2 branch

此時(shí)切換回master分支使用git merge test_branch2

$ git merge test_branch2 #合并分支

$ cat test_branch.txt #輸出master分支的文件內(nèi)容
this is master test_branch i want to merge test_branch2 branch file
this is test_branch2 branch

如果此時(shí)發(fā)生沖突介褥,需要手動(dòng)解決然后用 git add 沖突的文件名告訴git沖突已經(jīng)解決了然乎使用git commit完成最終合并

分支中的HEAD

使用

git reset HEAD 文件名

可以將已經(jīng)在暫存區(qū)中的文件挪出來即從暫存區(qū)刪除恢復(fù)原來的狀態(tài)

在只有一個(gè)分支的情況下HEAD指向的是當(dāng)前分支而master指向提交

分支中的HEAD

如果此時(shí)在master分支上在創(chuàng)建一個(gè)dev分支并切換到dev分支上

兩個(gè)分支中的HEAD.png

如果此時(shí)在dev分支上做一次提交那么狀態(tài)又如下所示:

dev分支提交一次的HEAD.png

總結(jié)而言就是HEAD是指向當(dāng)前分支的座掘,而當(dāng)前分支指向提交

如果將dev分支合并到master在沒有任何沖突的情況下的狀態(tài)如下圖:

將dev分支合并到master

產(chǎn)生沖突后分支合并沖突:

分支合并沖突

分支進(jìn)階與版本回退

fast-forward

  • 如果可能,合并分支時(shí)Git會(huì)使用fast-forward模式

  • 在這種模式下柔滔,刪除分支時(shí)會(huì)丟掉分支信息

  • 合并時(shí)加上--no-ff參數(shù)會(huì)禁用fast-forward溢陪,這樣會(huì)多出一個(gè)commit id

    git merge --no-ff dev
    
  • 查看log

    git log --graph
    

git add .git commit -m的簡(jiǎn)寫形式

git commit -am '提交描述'

版本回退

回退到上一版本

git reset --hard HEAD^
# 或者
git reset --hard HEAD~1 # 1位置表示回到第幾個(gè)提交
# 或者
git reset --hard commit_id

如果想回退兩個(gè)版本

git reset --hard HEAD^^

回退之后還可以通過commitId前進(jìn),通過commitId可以回退到任何提交例如:

git reset --hard ef34 #id前幾位就可以

返回到某一個(gè)版本

#reflog記錄的是操作日志就算版本回退了所有操作的commit依然存在
git reflog 

例如:

$ git reflog 
ef34732 (HEAD -> master) HEAD@{0}: reset: moving to ef347
a9b0f96 HEAD@{1}: reset: moving to HEAD^^
ef34732 (HEAD -> master) HEAD@{2}: reset: moving to HEAD^
690b3a8 HEAD@{3}: commit: fouth commit
ef34732 (HEAD -> master) HEAD@{4}: commit: third commit
1fa07d2 HEAD@{5}: commit: first commit:create some test file
a9b0f96 HEAD@{6}: commit (initial): init commit

然后就可以通過cmmitId進(jìn)行版本切換

checkout進(jìn)階與stash

使用下面的命令,可以丟棄修改(未添加到暫存區(qū)的修改)

 git checkout -- 文件名

checkout進(jìn)行版本切換

git checkout commitId

但是使用checkout切換版本屬于游離狀態(tài)與之前的版本切換是不一樣的睛廊。游離狀態(tài)的分支是沒有名字的只有commitId

分支改名:

git branch -m 原分支名 需要更改的名稱
例如將test_branch分支該名為test分支
git branch -m test_branch test

git stash可以將當(dāng)前分支未提交的內(nèi)容保存起來然后切換到其他分支形真,如果在當(dāng)前分支上做出修改沒有提交想要切換到其他分支可以使用此命令。

當(dāng)切換回來的時(shí)候使用git stash list恢復(fù)保存的內(nèi)容

例如:在dev分支寫的內(nèi)容已經(jīng)添加到暫存區(qū)了但是還沒寫完不能提交此時(shí)想要切換到其他分支

$ git checkout master
error: Your local changes to the following files would be overwritten by checkout:
        hello.txt
Please commit your changes or stash them before you switch branches.
Aborting

就會(huì)報(bào)錯(cuò)提示無法切換修改還沒有提交

那么就可以使用git stash命令將狀態(tài)保存起來

$ git stash
Saved working directory and index state WIP on dev: a773231 create a file
#也可以保存時(shí)輸入一下備注信息
# git stash '這是一段備注'

然后再其他分支做了一些事情之后超全,再切換來還原狀態(tài)

$ git checkout master
Switched to branch 'master'
# ....做事一些事情咆霜,然后切換回dev分支
$ git checkout dev
Switched to branch 'dev'

$ git stash list
stash@{0}: WIP on dev: a773231 create a file
stash@{1}: WIP on master: 690b3a8 fouth commit

保存工作現(xiàn)場(chǎng)總結(jié)

  • 保存現(xiàn)場(chǎng)
git stash
git stash list
  • 恢復(fù)現(xiàn)場(chǎng)
git stash apply(stash內(nèi)容并不刪除邓馒,需要通過git stash drop stash@(0}手動(dòng)刪除)

git stash pop(恢復(fù)的同時(shí)也將stash內(nèi)容刪除)

git stash apply stash@(0}

標(biāo)簽與diff

  • 新建標(biāo)簽,標(biāo)簽有兩種:輕量級(jí)標(biāo)簽(lightweight)與帶有附注標(biāo)簽
    (annotated)

  • 創(chuàng)建一個(gè)輕量級(jí)標(biāo)簽

    git tag v1.0.1
    
  • 創(chuàng)建一個(gè)帶有附注的標(biāo)簽

    git tag-a v1.0.2 -m 'release version'
    
  • 刪除標(biāo)簽

    git tag -d tag_name
    

查看文件都有誰修改過:

$ git blame test.txt
690b3a81 (guqing 2019-03-17 20:29:26 +0800 1) 我在這里添加了一行
690b3a81 (guqing 2019-03-17 20:29:26 +0800 2) 這是第四次修改

差異性比較diff

比較工作區(qū)和暫存區(qū)的差異

$ git diff
diff --git a/test.txt b/test.txt
index b704362..e5c0dec 100644
--- a/test.txt
+++ b/test.txt
@@ -1,3 +1,4 @@
 我在這里添加了一行
 這是第四次修改
 hello world
+hello java

代表有三行相同hello java這一行不同

比較工作區(qū)與特定的commitId的差異

git diff commit_id

例如:

$ git diff HEAD # HEAD指向的是一次提交
diff --git a/test.txt b/test.txt
index d0a5143..e5c0dec 100644
--- a/test.txt
+++ b/test.txt
@@ -1,2 +1,4 @@
 我在這里添加了一行
 這是第四次修改
+hello world
+hello java

比較暫存區(qū)與已提交特定把把版本的差異

git diff --cached commit_id #不加commit_id表示與最新提交比較

例如:

$ git diff --cached
diff --git a/test.txt b/test.txt
index d0a5143..b704362 100644
--- a/test.txt
+++ b/test.txt
@@ -1,2 +1,3 @@
 我在這里添加了一行
 這是第四次修改
+hello world

遠(yuǎn)程倉庫

push 推送

pull 拉取蛾坯,同時(shí)會(huì)執(zhí)行合并merge,pull == fetch + merge

推送命令:

git remote add origin 倉庫地址 #使用orgin與倉庫地址關(guān)聯(lián)
git push -u origin master # 將master推送到遠(yuǎn)程光酣,并與本地master分支關(guān)連,下次就不用再寫master

然后下次提交時(shí)使用git push就可以向該遠(yuǎn)程倉庫提交了

使用git remote show命令可以列出與當(dāng)前倉庫關(guān)聯(lián)的所有遠(yuǎn)程倉庫

查看遠(yuǎn)程倉庫詳細(xì)信息git remote show orgin

基于Git分支的開發(fā)模型:

  • develop分支(頻繁變化的一個(gè)分支)
  • test分支(供測(cè)試與產(chǎn)品等人員使用的一個(gè)分支脉课,變化不是特別頻繁)
  • master分支(生產(chǎn)發(fā)布分支救军,變化非常不頻繁的一個(gè)分支)
  • bugfix(hotfix)分支(生產(chǎn)系統(tǒng)當(dāng)中出現(xiàn)了緊急Bug,用于緊急修復(fù)的分支)
git push origin +master #強(qiáng)制推送到遠(yuǎn)程

git fetch 和git pull 的差別

  1. git fetch 相當(dāng)于是從遠(yuǎn)程獲取最新到本地下翎,不會(huì)自動(dòng)merge缤言,如下指令:
 git fetch orgin master //將遠(yuǎn)程倉庫的master分支下載到本地當(dāng)前branch中

 git log -p master  ..origin/master //比較本地的master分支和origin/master分支的差別

 git merge origin/master //進(jìn)行合并

也可以用以下指令:

git fetch origin master:tmp //從遠(yuǎn)程倉庫master分支獲取最新,在本地建立tmp分支

git diff tmp //將當(dāng)前分支和tmp進(jìn)行對(duì)比

git merge tmp //合并tmp分支到當(dāng)前分支
  1. git pull:相當(dāng)于是從遠(yuǎn)程獲取最新版本并merge到本地
git pull origin master

git pull 相當(dāng)于從遠(yuǎn)程獲取最新版本并merge到本地

在實(shí)際使用中视事,git fetch更安全一些

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胆萧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俐东,更是在濱河造成了極大的恐慌跌穗,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虏辫,死亡現(xiàn)場(chǎng)離奇詭異蚌吸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)砌庄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門羹唠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人娄昆,你說我怎么就攤上這事佩微。” “怎么了萌焰?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵哺眯,是天一觀的道長。 經(jīng)常有香客問我扒俯,道長奶卓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任撼玄,我火速辦了婚禮夺姑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘互纯。我一直安慰自己瑟幕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布留潦。 她就那樣靜靜地躺著只盹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兔院。 梳的紋絲不亂的頭發(fā)上殖卑,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音坊萝,去河邊找鬼孵稽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛十偶,可吹牛的內(nèi)容都是我干的菩鲜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼惦积,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼接校!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狮崩,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤蛛勉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后睦柴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诽凌,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年坦敌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侣诵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡狱窘,死狀恐怖杜顺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情训柴,我是刑警寧澤哑舒,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站幻馁,受9級(jí)特大地震影響洗鸵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仗嗦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一诬烹、第九天 我趴在偏房一處隱蔽的房頂上張望驹吮。 院中可真熱鬧,春花似錦、人聲如沸告抄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至躲胳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纤勒,已是汗流浹背坯苹。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摇天,地道東北人粹湃。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像泉坐,于是被迫代替她去往敵國和親为鳄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • (預(yù)警:因?yàn)樵敿?xì)腕让,所以行文有些長孤钦,新手邊看邊操作效果出乎你的預(yù)料) 一:Git是什么? Git是目前世界上最先進(jìn)的...
    axiaochao閱讀 1,923評(píng)論 1 8
  • 聲明:這篇文章來源于廖雪峰老師的官方網(wǎng)站记某,我僅僅是作為學(xué)習(xí)之用 Git簡(jiǎn)介 Git是什么司训? Git是目前世界上最先...
    橫渡閱讀 3,943評(píng)論 3 27
  • 簡(jiǎn)介 Git是一個(gè)開源的分布式版本控制系統(tǒng),用于敏捷高效地處理任何或小或大的項(xiàng)目液南。 Git 與常用的版本控制工具 ...
    閩越布衣閱讀 2,735評(píng)論 0 18
  • 安裝Git Git的下載地址:Git官網(wǎng)下載地址 Git本地倉庫和命令 配置用戶 下載完Git后壳猜,右鍵會(huì)有一個(gè)Gi...
    TokyoZ閱讀 4,488評(píng)論 1 7
  • 一、基本概念: 注:對(duì)于git的分布式概念及其優(yōu)點(diǎn)滑凉,不重復(fù)說明统扳,自己百度或谷歌。本文中涉及到指令前面有$的畅姊,在cm...
    大廠offer閱讀 1,408評(píng)論 0 3