github命令行操作從入門到熟悉

因?yàn)樵陂_發(fā)過(guò)程中使用的是sourceTree這種git圖形化界面管理工具,導(dǎo)致git命令每隔一段時(shí)間就會(huì)有點(diǎn)生疏尚骄。那么就有了這片寫作的動(dòng)機(jī),試圖通過(guò)這樣一篇文章的總結(jié),讓我們從git的第一次安裝度秘,到熟練操作git的命令,都能在此得到體現(xiàn)饵撑。

一:安裝git之后的配置

當(dāng)我們下載安裝好git之后剑梳,第一步就是為git設(shè)置好用戶名和郵箱,這個(gè)用戶名和郵箱會(huì)在提交的日志中顯示滑潘,如果項(xiàng)目公開了垢乙,那么在github中也可以查看到。設(shè)置成功之后的信息保存在~/.gitconfig這個(gè)文件中语卤。

git config --global user.name "xiaguangcheng"
git config --global user.email "xiaguangcheng@163.com"
git config --global color.ui auto

上面的最后一行命令將命令行的輸出顯示為自動(dòng)顏色追逮,這樣方便我們閱讀。設(shè)置完之后粹舵,我們就可以查看設(shè)置效果:

sublime ~/.gitconfig

由于我對(duì)sublime設(shè)置了別名钮孵,因此可以直接打開sublime編輯器查看。效果如下:

[user]
    name = xiaguangcheng
    email = xiaguangcheng@163.com
[color]
    ui = auto

二:git本地倉(cāng)庫(kù)與git遠(yuǎn)程倉(cāng)庫(kù)(github)之間的鏈接

github是用git來(lái)管理的倉(cāng)庫(kù)眼滤,本地與遠(yuǎn)程的連接是通過(guò)SSH公鑰和私鑰來(lái)完成的巴席。那么如何獲取本地電腦的公鑰和私鑰呢?

ssh-keygen -t rsa -C "xiaguangcheng@163.com"

然后一路回車诅需,如果沒(méi)有錯(cuò)誤提示漾唉,就表示生成成功了荧库。生成的文件保存在~/.ssh這個(gè)隱藏文件夾下,我們打開這個(gè)文件夾會(huì)有以下三個(gè)文件:
id_rsa
id_rsa.pub
known_hosts
而我們需要的公鑰就保存在id_rsa.pub中赵刑。我們可以在github的setting中的 SSH Keys中分衫,任意建立一個(gè)title當(dāng)作公鑰的名稱,然后復(fù)制這個(gè)id_rsa.pub文件中的內(nèi)容般此,到這輸入框中蚪战。

image.png

然后我們就可以通過(guò)在本地電腦中測(cè)試是否能夠與github連接了

ssh -T git@github.com

三:在github中創(chuàng)建新倉(cāng)庫(kù)

在github中create一個(gè)新的倉(cāng)庫(kù)的時(shí)候,會(huì)有一個(gè)initialize this repository with a README選項(xiàng)铐懊,我們不建議勾選邀桑。因?yàn)橐坏┕催x了,那么這個(gè)倉(cāng)庫(kù)就有內(nèi)容了居扒,就失去了原初面目概漱,這樣的話,如果本地已經(jīng)有了一個(gè)git項(xiàng)目喜喂,想要提交到這里瓤摧,就需要先拉取再提交,而不能直接提交了玉吁。

四:clone遠(yuǎn)程倉(cāng)庫(kù)到本地

git clone url

當(dāng)我們clone倉(cāng)庫(kù)到本地后照弥,可以在倉(cāng)庫(kù)中新建一個(gè)文件并修改。然后使用

git status 

查看本地倉(cāng)庫(kù)的狀態(tài)进副。通過(guò)

git add name.txt

添加name.txt 到暫存區(qū)这揣。通過(guò)

git commit -m "add file"

將暫存區(qū)里面的文件統(tǒng)一提交到本地倉(cāng)庫(kù)。再通過(guò)

git push

就可以將本地倉(cāng)庫(kù)推送到遠(yuǎn)程倉(cāng)庫(kù)了影斑。

五:git詳細(xì)操作

前面講解了在先有g(shù)ithub的倉(cāng)庫(kù)给赞,然后克隆到本地進(jìn)行修改推送的操作。接下來(lái)我們看看先有本地倉(cāng)庫(kù)矫户,然后再連接本地和遠(yuǎn)程倉(cāng)庫(kù)片迅,推送到遠(yuǎn)程倉(cāng)庫(kù)的情況。

(一):創(chuàng)建一個(gè)本地倉(cāng)庫(kù)
mkdir gitTest
cd gitTest
git init

這樣就創(chuàng)建了一個(gè)本地文件夾皆辽,并且在里面進(jìn)行了初始化柑蛇。

(二):添加一個(gè)本地文件
touch test.txt
echo "first" >> test.txt
cat test.txt //我們可以查看test.txt里面的內(nèi)容

到這里,我們創(chuàng)建了一個(gè)test.txt的文件驱闷,并且在里面添加了一個(gè)first字符串耻台。此時(shí)我們可以通過(guò)命令查看當(dāng)前倉(cāng)庫(kù)的情況

git status 
image.png

這要得益于我們之前配置的color.ui auto 因此我們可以看到一個(gè)紅色的標(biāo)志,上面的文字說(shuō)明了這個(gè)文件沒(méi)有被track空另,也就是這個(gè)文件獨(dú)立于這個(gè)倉(cāng)庫(kù)盆耽,并沒(méi)有被git管理到,那么我們經(jīng)過(guò)以下幾個(gè)操作,就可以讓這個(gè)文件處在git的管理中了征字。

git add test.txt
git commit -m "add first"
git status
image.png

如圖所示都弹,我們已經(jīng)將一個(gè)文件添加到git版本控制了娇豫。

(三):修改文件并查看修改前后差別,然后提交匙姜。
echo "second" >> test.txt
echo "thrid" >> test.txt
git status
git diff


這個(gè)時(shí)候,我們就可以提交了冯痢。但是我們要養(yǎng)成一個(gè)習(xí)慣氮昧,當(dāng)我們把修改的文件添加到暫存區(qū)之后,準(zhǔn)備commit的時(shí)候浦楣,最好先通過(guò)git diff HEAD來(lái)查看上次提交袖肥,和正準(zhǔn)備提交的這次,兩者之間的差別振劳。這里的HEAD是本分支的最后一次提交的指針椎组。當(dāng)我們看完之后,才提交就比較安全了历恐。

image.png

我們可以通過(guò)下面這個(gè)命令寸癌,查看屬于這個(gè)文件的相關(guān)日志

git log test.txt 
(四):操作分支

git的強(qiáng)大之處表現(xiàn)之一就是分支。比如此時(shí)我們使用

git branch

就會(huì)顯示一個(gè)黃綠色的master弱贼。表明我們身在master分支中蒸苇。如果我們想以master分支創(chuàng)建新分支

git checkout -b develop
image.png

此時(shí)我們就身在develop分支中了。實(shí)際上上面的命令等同于下面的兩條命令

git branch develop
git checkout develop

俗話說(shuō)花開兩朵吮旅,暫表一枝溪烤。咱們先不管master分支,先來(lái)培育新建的這個(gè)develop分支庇勃。下面我們打算修改test.txt檬嘀,將里面的second修改為forth,然后在提交之前责嚷,先通過(guò)git diff Head查看和最近一次提交的差別鸳兽,然后提交。

image.png
(五):切換分支

上面我們已經(jīng)在develop分支中把代碼修改完了再层,此時(shí)我們可以使用命令來(lái)切換分支贸铜,看看master分支有沒(méi)有受到我們?cè)赿evelop分支上進(jìn)行改動(dòng)的影響。

git checkout master
image.png

正如大家所見(jiàn)聂受,剛剛我們?cè)赿evelop分支中蒿秦,將second修改為了forth,但是在master分支中蛋济,second依然為second棍鳖。

(六):合并分支

現(xiàn)在我們打算將在develop中的修改,應(yīng)用到master分支上,可以如下操作渡处,記住我們像把a(bǔ)分支合并到b分支上镜悉,我們需要把代碼切換到b分支上,如果不放心是否在b分支上医瘫,可以先git branch一下看看侣肄。在merge的過(guò)程中,會(huì)彈出編輯框醇份,這個(gè)編輯框是vi模式稼锅,需要懂得vi快捷鍵才能進(jìn)行編輯。

git branch
git merge --no-ff develop
git log

合并完成之后僚纷,我們也可以通過(guò)另外一個(gè)命令查看日志

git log --graph
image.png
(七):回溯分支

從上面的圖中矩距,我們可以看到當(dāng)前我們?cè)趍aster分支中,并且在中間又創(chuàng)建了一個(gè)新的develop分支怖竭。并且在develop分支中對(duì)test.txt進(jìn)行了修改锥债,然后又合并到了master分支中。那么我們現(xiàn)在就是要回溯分支痊臭。通過(guò)命令在master分支還沒(méi)有創(chuàng)建develop分支的時(shí)候哮肚,創(chuàng)建一個(gè)online分支,然后修改online分支并提交趣兄,再切回到master分支合并develop分支之后的狀態(tài)绽左,然后再合并online分支。這樣聽起來(lái)有一點(diǎn)yesterday once more的感覺(jué)艇潭。

我們要回溯分支拼窥,需要一個(gè)時(shí)間點(diǎn)的hash值,這個(gè)hash值可以通過(guò)git log來(lái)獲得蹋凝。通過(guò)上圖我們可以看出我們實(shí)際上是想回到2a95a4...這個(gè)節(jié)點(diǎn)鲁纠,現(xiàn)在我們?cè)趍aster分支上

git reset --hard 2a95a4

通過(guò)上圖的幾個(gè)命令操作,我們發(fā)現(xiàn)此時(shí)的master分支上的test.txt內(nèi)容鳍寂,已經(jīng)沒(méi)有了被之前develop修改的痕跡了改含,之前develop修改了second為forth,但是此時(shí)這個(gè)forth就不存在了迄汛。

這是我們就可以創(chuàng)建一個(gè)新的分支online捍壤,然后在online分支上,對(duì)這個(gè)test.txt進(jìn)行操作了鞍爱。

image.png

上面操作的命令鹃觉,就不用具體講解了,我們最后看到在online分支上的test.txt中的second這個(gè)字符串睹逃,被我們修改為了online這個(gè)字符串盗扇。接著我們就提交了這次修改。提交修改后,我們需要切換回master分支疗隶,準(zhǔn)備再次回到master與develop合并的那個(gè)節(jié)點(diǎn)佑笋。此時(shí)的git log命令只能查詢當(dāng)前節(jié)點(diǎn)之前的日志,但是當(dāng)前節(jié)點(diǎn)是在master與develop合并之前斑鼻,所以要查看所有的節(jié)點(diǎn)蒋纬,我們需要引入新的命令

git reflog
image.png

此時(shí)我們?cè)偈褂妹钋袚Q,將master分支切換到其與develop 分支合并的地方

git reset --hard 8441ba2


通過(guò)log卵沉,我們也可以看出颠锉,我們已經(jīng)將當(dāng)前節(jié)點(diǎn)切換到了講develop合并到master上的地方法牲。其中git log --pretty=short表示我們查看精簡(jiǎn)版的日志史汗,也就是每條日志不看提交日期。

接下來(lái)我們?cè)賮?lái)將online分支合并到master分支上拒垃。

image.png

這是我們看到命令提示CONFLICT停撞。表示合并出現(xiàn)來(lái)沖突,我們通過(guò)sublime打開這個(gè)test.txt文件查看沖突悼瓮,結(jié)果如圖所示戈毒。
image.png

分析如下:在master分支與online分支合并之前,master分支上的test.txt中的second字符串已經(jīng)被develop字符串修改為forth横堡,但是現(xiàn)在online分支又將之前的second修改為online埋市,所以系統(tǒng)不知道這二者之間到底要保存哪一個(gè)?因此出現(xiàn)來(lái)沖突命贴。這是需要我們自己手動(dòng)解決沖突道宅,我們可以保留forth,也可以保留online胸蛛,也可以兩者都保留污茵,或者兩者都不保留。這里我們就保留online吧葬项。

記得將git的沖突標(biāo)志以及不需要的代碼刪除泞当,結(jié)果如下

image.png

然后我們提交修改之后的內(nèi)容,并查看結(jié)果

image.png
(八):修改提交信息

我們通過(guò)git log --graph 查看日志民珍,發(fā)現(xiàn)上次提交叫做“conflict”不太合適襟士,于是我們想要補(bǔ)充這次提交的日志。我們可以使用新命令

git commit --amend
image.png
(九):修改日志

修改提交日志可以使用git rebase 命令嚷量,比如我們要將一個(gè)變量換一個(gè)名字等陋桂。

image.png

如圖所示,我們這里產(chǎn)生了兩次提交津肛,第一次提交添加了一個(gè)develop章喉,第二次提交修改develop為develop_b,下面我們通過(guò)命令將這兩個(gè)提交進(jìn)行合并

git rebase  -i HEAD~2

此時(shí)會(huì)彈出一個(gè)編輯框,我們把編輯框里面的需要修改的日志前面的pick改成fixup即可秸脱,保存退出編輯框落包。我們通過(guò)命令查看

image.png

但是如果我們使用git reflog查看的話,我們的修改動(dòng)作摊唇,一目了然

image.png

六:推送本地倉(cāng)庫(kù)到遠(yuǎn)程

我們推送本地倉(cāng)庫(kù)到遠(yuǎn)程咐蝇,首先需要確保有本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)。遠(yuǎn)程倉(cāng)庫(kù)作為一個(gè)剛剛初始化的倉(cāng)庫(kù)巷查,最好不要?jiǎng)?chuàng)建任何東西在里面有序,連README.md最好也不要有。那么我們就可以通過(guò)下面的命令將遠(yuǎn)程倉(cāng)庫(kù)設(shè)置為本地倉(cāng)庫(kù)的遠(yuǎn)程倉(cāng)庫(kù)

git remote add origin git@github.com:xiaguangcheng/gitTest.git

現(xiàn)在我們回到master分支岛请,通過(guò)命令

git push -u origin master 

開始推送本地倉(cāng)庫(kù)旭寿。

如果我們想推送其他分支

git check out develop
git push -u origin develop

這樣就可以了。然后我們可以通過(guò)命令查看是否是否推送成功

git branch -a

如果我們想從遠(yuǎn)程檢出新分支崇败,那么我們可以

git checkout -b develop_c origin/develop_c

這個(gè)命令表示盅称,我們從遠(yuǎn)程檢出一個(gè)名為develop_c的分支,并且保存在本地倉(cāng)庫(kù)后室,同時(shí)也命名為develop_c缩膝。
記住,我們?cè)谀膫€(gè)分支上使用

git push

就會(huì)推送本分支到本分支遠(yuǎn)程的分支上岸霹。git pull 和git push同理疾层。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贡避,隨后出現(xiàn)的幾起案子痛黎,更是在濱河造成了極大的恐慌,老刑警劉巖贸桶,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舅逸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡皇筛,警方通過(guò)查閱死者的電腦和手機(jī)琉历,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)水醋,“玉大人旗笔,你說(shuō)我怎么就攤上這事≈糇伲” “怎么了蝇恶?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)惶桐。 經(jīng)常有香客問(wèn)我撮弧,道長(zhǎng)潘懊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任贿衍,我火速辦了婚禮授舟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贸辈。我一直安慰自己释树,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布擎淤。 她就那樣靜靜地躺著奢啥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘴拢。 梳的紋絲不亂的頭發(fā)上桩盲,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音炊汤,去河邊找鬼正驻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛抢腐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播襟交,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼迈倍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了捣域?” 一聲冷哼從身側(cè)響起啼染,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎焕梅,沒(méi)想到半個(gè)月后迹鹅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贞言,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年斜棚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片该窗。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弟蚀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酗失,到底是詐尸還是另有隱情义钉,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布规肴,位于F島的核電站捶闸,受9級(jí)特大地震影響夜畴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜删壮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一斩启、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧醉锅,春花似錦兔簇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至经柴,卻和暖如春狸窘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坯认。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工翻擒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牛哺。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓陋气,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親引润。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巩趁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • 在我去吃早餐的路上 我遇見(jiàn)了你 站在透明的玻璃柜外 我凝視著你 盡管我永遠(yuǎn)看不見(jiàn)你的眼淚 但我無(wú)法以快樂(lè)掩飾去我內(nèi)...
    在南疆的路上閱讀 866評(píng)論 2 5
  • 重寫方法的規(guī)則: 1、參數(shù)列表必須完全與被重寫的方法相同淳附,否則不能稱其為重寫而是重載议慰。 2、返回的類型必須一直與被...
    張?zhí)靸?/span>閱讀 154評(píng)論 0 0
  • 慕皓天怎么也沒(méi)有想到,他前腳剛到營(yíng)地洽糟,后腳就被押了回來(lái)炉菲,還被判了個(gè)通敵賣國(guó)的罪名。他本因?yàn)樽约菏且獞?zhàn)死沙場(chǎng)的脊框,...
    一剪芳蹤閱讀 360評(píng)論 0 0