Git 學(xué)習(xí)筆記

----------------- Git 學(xué)習(xí) ------------------

Git 簡(jiǎn)介


Git,分布式版本控制系統(tǒng)!
我的理解:對(duì)每次操作都有一次記錄,方便修改和回退!來(lái)達(dá)到版本的控制.

** 集中式和分布式的區(qū)別 **

集中式版本控制系統(tǒng)

  • 版本庫(kù)集中存放在中央服務(wù)器上,干活的時(shí)候,要先從服務(wù)器取得最新版本,然后開始干活.干完活,再把自己的活推送給中央服務(wù)器.
  • 比喻: 圖書館借書 -> 看完 -> 再還回去
  • 缺點(diǎn): 必須聯(lián)網(wǎng)才能工作(或者內(nèi)部局域網(wǎng)里搭建了一個(gè)服務(wù)器來(lái)承載);外網(wǎng),網(wǎng)速慢,下載和提交時(shí)間長(zhǎng)

分布式版本控制系統(tǒng)

  • 根本沒有"中央服務(wù)器",每個(gè)人的電腦都是一個(gè)完整的版本庫(kù),工作的時(shí)候,就不需要聯(lián)網(wǎng)了,因?yàn)榘姹編?kù)就在自己電腦上.
  • 每個(gè)人都是一個(gè)版本庫(kù),那如何體現(xiàn)多人協(xié)同合作呢? 這里只需要把各自的修改推送給對(duì)方,就可以互相看到對(duì)方的修改了,強(qiáng)大的分支管理.

Git 安裝


Ubuntu 下 安裝

首先,你可以試著輸入git,看看系統(tǒng)有沒有安裝Git:

$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git

像上面的命令愚墓,有很多Linux會(huì)友好地告訴你Git沒有安裝予权,還會(huì)告訴你如何安裝Git。

執(zhí)行 apt-get install git 安裝

twitch@laravel:~$ sudo apt-get install git
[sudo] twitch 的密碼:
正在讀取軟件包列表... 完成
正在分析軟件包的依賴關(guān)系樹       
正在讀取狀態(tài)信息... 完成       
git 已經(jīng)是最新版 (1:2.7.4-0ubuntu1)浪册。

這邊我是之前就安裝好了!

注意: 系統(tǒng)版本老一點(diǎn)的話,把命令改為sudo apt-get install git-core扫腺,因?yàn)橐郧坝袀€(gè)軟件也叫GIT(GNU Interactive Tools),結(jié)果Git就只能叫g(shù)it-core了村象。由于Git名氣實(shí)在太大笆环,后來(lái)就把GNU Interactive Tools改成gnuit,git-core正式改為git厚者。

創(chuàng)建版本庫(kù)


版本庫(kù):
什么是版本庫(kù)呢躁劣?版本庫(kù)又名倉(cāng)庫(kù),英文名repository籍救,你可以簡(jiǎn)單理解成一個(gè)目錄习绢,這個(gè)目錄里面的所有文件都可以被Git管理起來(lái),每個(gè)文件的修改蝙昙、刪除闪萄,Git都能跟蹤,以便任何時(shí)刻都可以追蹤歷史奇颠,或者在將來(lái)某個(gè)時(shí)刻可以“還原”败去。

創(chuàng)建一個(gè)版本庫(kù)

一、版本庫(kù)目錄

創(chuàng)建一個(gè)版本庫(kù)非常簡(jiǎn)單烈拒,首先圆裕,選擇一個(gè)合適的地方,創(chuàng)建一個(gè)空目錄(learngit,不要有中文的命名哦!):

twitch@laravel:~$ mkdir learngit
twitch@laravel:~$ cd learngit
twitch@laravel:~/learngit$ pwd
/home/twitch/learngit

二荆几、讓你的目錄成為Git可以管理的倉(cāng)庫(kù)

twitch@laravel:~/learngit$ git init
初始化空的 Git 倉(cāng)庫(kù)于 /home/twitch/learngit/.git/

提示這個(gè),就說(shuō)明我們的git倉(cāng)庫(kù)創(chuàng)建好了! 初始化倉(cāng)庫(kù)后 在你的版本目錄下 會(huì)出現(xiàn)一個(gè) .git 的隱藏文件了!

twitch@laravel:~/learngit$ ll
總用量 12
drwxrwxr-x  3 twitch twitch 4096 9月  20 16:57 ./
drwxr-xr-x 29 twitch twitch 4096 9月  20 16:50 ../
drwxrwxr-x  7 twitch twitch 4096 9月  20 16:57 .git/

三吓妆、添加文件到版本庫(kù)

在learngit倉(cāng)庫(kù)下,創(chuàng)建一個(gè) readme.md 文件,內(nèi)容如下:

Git is a version control system.
Git is free software.

然后,使用 git status 命令,來(lái)看看現(xiàn)在倉(cāng)庫(kù)的狀態(tài)

twitch@laravel:~/learngit$ git status
位于分支 master

初始提交

未跟蹤的文件:
  (使用 "git add <文件>..." 以包含要提交的內(nèi)容)

    readme.md

提交為空,但是存在尚未跟蹤的文件(使用 "git add" 建立跟蹤)

提示很清晰的告訴了我們,提交內(nèi)容為空,但是倉(cāng)庫(kù)里存在一個(gè)為被跟蹤的文件 "readme.md",也提示到 使用 git add 命令 來(lái)跟蹤!

twitch@laravel:~/learngit$ git add .        //. 當(dāng)前文件目錄下
twitch@laravel:~/learngit$ git status
位于分支 master

初始提交

要提交的變更:
  (使用 "git rm --cached <文件>..." 以取消暫存)

    新文件:   readme.md

查看下當(dāng)前的倉(cāng)庫(kù)狀態(tài),可以看到初始提交到一個(gè)文件,但是這提交的文件是暫時(shí)存放在暫存區(qū)里,并沒有真正的提交上去.

接下來(lái),真正的把文件提交到倉(cāng)庫(kù)

twitch@laravel:~/learngit$ git commit -m "wrote a readme file"

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'twitch@laravel.(none)')

提交的時(shí)候,如果出現(xiàn)這些提示,說(shuō)明你還沒自報(bào)家門,沒有聲明你是誰(shuí)!也人性化的告訴了你使用申明方法去聲明你的身份!

twitch@laravel:~/learngit$ git config --global user.email "342766475@qq.com"
twitch@laravel:~/learngit$ git config --global user.name "twitch"

然后再次提交下, 顯示下面這樣就說(shuō)明提交成功了!-m 后面輸入本次提交的說(shuō)明,可以輸入任意內(nèi)容吨铸,當(dāng)然最好是有意義的行拢,這樣你就能從歷史記錄里方便地找到改動(dòng)記錄。

twitch@laravel:~/learngit$ git commit -m "wrote a readme file"
[master (根提交) 89293b9] wrote a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.md

為什么Git添加文件需要add诞吱,commit一共兩步呢舟奠?因?yàn)閏ommit可以一次提交很多文件,所以你可以多次add不同的文件,只做一次提交!

twitch@laravel:~/learngit$ touch file1.txt     // 使用 touch 命令 創(chuàng)建三個(gè)文件!
twitch@laravel:~/learngit$ git add file1.txt
twitch@laravel:~/learngit$ git add file2.txt file3.txt
twitch@laravel:~/learngit$ git commit -m "add three files"
[master fa7ab77] add three files
 3 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file1.txt
 create mode 100644 file2.txt
 create mode 100644 file3.txt

時(shí)光機(jī)穿梭


對(duì) readme.md 文件進(jìn)行修改,修改內(nèi)容如下:

Git is a distributed version control system.
Git is free software.

再輸入 git status 查看下倉(cāng)庫(kù)的當(dāng)前的狀態(tài),就能知道一個(gè) 文件被修改過(guò)了!

twitch@laravel:~/learngit$ git status
位于分支 master
尚未暫存以備提交的變更:
  (使用 "git add <文件>..." 更新要提交的內(nèi)容)
  (使用 "git checkout -- <文件>..." 丟棄工作區(qū)的改動(dòng))

    修改:     readme.md

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

再次 輸入 git diff(顧名思義就是查看difference)查看下具體修改的內(nèi)容:


twitch@laravel:~/learngit$ git diff
diff --git a/readme.md b/readme.md
index 46d49bf..9247db6 100644
--- a/readme.md
+++ b/readme.md
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
 Git is free software.

對(duì)修改過(guò)的文件提交和新文件的提交方式都一樣,兩步:

twitch@laravel:~/learngit$ git add readme.md
twitch@laravel:~/learngit$ git status
位于分支 master
要提交的變更:
  (使用 "git reset HEAD <文件>..." 以取消暫存)

    修改:     readme.md

twitch@laravel:~/learngit$ git commit -m "add distributed!"
[master fa65c67] add distributed!
 1 file changed, 1 insertion(+), 1 deletion(-)

版本回退

現(xiàn)在,我對(duì)的倉(cāng)庫(kù)里有三個(gè)版本

版本1:wrote a readme file

Git is a version control system.
Git is free software.

版本2:add three files

版本3: add distributed

Git is a distributed version control system.
Git is free software.

現(xiàn)在,我知道 有三個(gè)版本和修改了什么,因?yàn)楹?jiǎn)單量少,要是在一個(gè)千行的代碼,你還記得修改了什么,所以Git 給我們提供了一個(gè)歷史記錄的功能,使用 git log(顯示從最近到最遠(yuǎn)的提交日志) 查看:


twitch@laravel:~/learngit$ git log
commit fa65c67b5b04c1f8939c4fa570591f531c174222
Author: twitch <342766475@qq.com>
Date:   Tue Sep 20 21:08:11 2016 +0800

    add distributed!

commit fa7ab774b59f8ab74d690e38f963049eff0296ee
Author: twitch <342766475@qq.com>
Date:   Tue Sep 20 20:31:41 2016 +0800

    add three files      

commit 89293b9bca9197b3800c3568a800e08175900b96
Author: twitch <342766475@qq.com>
Date:   Tue Sep 20 20:17:54 2016 +0800

    wrote a readme file

加上 --pretty=oneline 參數(shù) 是對(duì)日志顯示進(jìn)行格式化,只顯示 提交版本號(hào) 和 提交的記錄信息

twitch@laravel:~/learngit$ git log --pretty=oneline
fa65c67b5b04c1f8939c4fa570591f531c174222 add distributed!
fa7ab774b59f8ab74d690e38f963049eff0296ee add three files
89293b9bca9197b3800c3568a800e08175900b96 wrote a readme file

正式開啟 時(shí)光穿梭機(jī)
將 readme.md 回退到上一個(gè)版本.

首先房维,Git必須知道當(dāng)前版本是哪個(gè)版本沼瘫,在Git中,用 HEAD 表示當(dāng)前版本咙俩,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一樣)耿戚,上一個(gè)版本就是 HEAD^,上上一個(gè)版本就是 HEAD^^,當(dāng)然往上100個(gè)版本寫100個(gè)^比較容易數(shù)不過(guò)來(lái)溅话,所以寫成 HEAD~100晓锻。

twitch@laravel:~/learngit$ git reset --hard HEAD^
HEAD 現(xiàn)在位于 fa7ab77 add three files

再使用 git log 查看下日志,你會(huì)發(fā)現(xiàn)最早的版本不見了

commit fa7ab774b59f8ab74d690e38f963049eff0296ee
Author: twitch <342766475@qq.com>
Date:   Tue Sep 20 20:31:41 2016 +0800

    add three files

commit 89293b9bca9197b3800c3568a800e08175900b96
Author: twitch <342766475@qq.com>
Date:   Tue Sep 20 20:17:54 2016 +0800

    wrote a readme file

想再回去已經(jīng)回不去了,腫么辦飞几?
辦法就是:1砚哆、你的當(dāng)前執(zhí)行命令窗口沒關(guān),就可以順這往上找屑墨,只要找到 版本3 的 commit id 號(hào) 就回到未來(lái)指定的版本了躁锁!
版本號(hào)沒必要寫全,前幾位就可以了卵史,Git會(huì)自動(dòng)去找战转。當(dāng)然也不能只寫前一兩位,因?yàn)镚it可能會(huì)找到多個(gè)版本號(hào)以躯,就無(wú)法確定是哪一個(gè)了槐秧。

twitch@laravel:~/learngit$ git reset --hard fa65c67b5b04c1f8939c4fa570591f531c174222
HEAD 現(xiàn)在位于 fa65c67 add distributed!

commit fa65c67b5b04c1f8939c4fa570591f531c174222
Author: twitch <342766475@qq.com>
Date:   Tue Sep 20 21:08:11 2016 +0800

    add distributed!

commit fa7ab774b59f8ab74d690e38f963049eff0296ee
Author: twitch <342766475@qq.com>
Date:   Tue Sep 20 20:31:41 2016 +0800

    add three files

commit 89293b9bca9197b3800c3568a800e08175900b96
Author: twitch <342766475@qq.com>
Date:   Tue Sep 20 20:17:54 2016 +0800

    wrote a readme file

2、要是回退后關(guān)閉了命令窗口忧设,找不到版本 commit id 了刁标,怎么班了!這里你就要使用 git reflog (查看你操作的每一次記錄!),然后就可以找到你的commit id 了!

twitch@laravel:~/learngit$ git reflog
fa65c67 HEAD@{0}: reset: moving to fa65c67b5b04c1f8939c4fa570591f531c174222
fa7ab77 HEAD@{1}: reset: moving to HEAD^
fa65c67 HEAD@{2}: commit: add distributed!
fa7ab77 HEAD@{3}: commit: add three files
89293b9 HEAD@{4}: commit (initial): wrote a readme file

工作區(qū)和暫存區(qū)

Git和其他版本控制系統(tǒng)如SVN的一個(gè)不同之處就是有暫存區(qū)的概念址晕。

  • 工作區(qū): 電腦里能看到的目錄,就是我們創(chuàng)建的 learngit 文件夾.
  • 版本庫(kù): 工作區(qū)里有一個(gè)隱藏的 .git 目錄,這個(gè)就是 git 的版本庫(kù).
  • Git的版本庫(kù)里存了很多東西膀懈,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master谨垃,以及指向master的一個(gè)指針叫HEAD启搂。
twitch@laravel:~/learngit/.git$ ll
總用量 64
drwxrwxr-x  8 twitch twitch 4096 9月  20 22:29 ./
drwxrwxr-x  3 twitch twitch 4096 9月  20 21:56 ../
drwxrwxr-x  2 twitch twitch 4096 9月  20 16:57 branches/
-rw-rw-r--  1 twitch twitch   17 9月  20 21:08 COMMIT_EDITMSG
-rw-rw-r--  1 twitch twitch  225 9月  20 20:14 COMMIT_EDITMSG.save
-rw-rw-r--  1 twitch twitch 1024 9月  20 20:13 .COMMIT_EDITMSG.swp
-rw-rw-r--  1 twitch twitch   92 9月  20 16:57 config
-rw-rw-r--  1 twitch twitch   73 9月  20 16:57 description
-rw-rw-r--  1 twitch twitch   23 9月  20 16:57 HEAD
drwxrwxr-x  2 twitch twitch 4096 9月  20 16:57 hooks/
-rw-rw-r--  1 twitch twitch  353 9月  20 21:56 index   //暫存區(qū)
drwxrwxr-x  2 twitch twitch 4096 9月  20 16:57 info/
drwxrwxr-x  3 twitch twitch 4096 9月  20 20:17 logs/
drwxrwxr-x 11 twitch twitch 4096 9月  20 20:57 objects/
-rw-rw-r--  1 twitch twitch   41 9月  20 21:56 ORIG_HEAD
drwxrwxr-x  4 twitch twitch 4096 9月  20 16:57 refs/

分析下我們把文件添加到倉(cāng)庫(kù)中的兩步操作:

  • 第一步是用git add把文件添加進(jìn)去,實(shí)際上就是把文件修改添加到暫存區(qū)刘陶;

  • 第二步是用git commit提交更改胳赌,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支。

因?yàn)槲覀儎?chuàng)建Git版本庫(kù)時(shí)匙隔,Git自動(dòng)為我們創(chuàng)建了唯一一個(gè)master分支疑苫,所以,現(xiàn)在牡直,git commit就是往master分支上提交更改。
你可以簡(jiǎn)單理解為纳决,需要提交的文件修改通通放到暫存區(qū)碰逸,然后,一次性提交暫存區(qū)的所有修改阔加。

舉個(gè)栗子:
對(duì) readme.md 進(jìn)行一次修改,再創(chuàng)建一個(gè)listen文件!

twitch@laravel:~/learngit$ vim readme.md
twitch@laravel:~/learngit$ vim listen
twitch@laravel:~/learngit$ git status
位于分支 master
尚未暫存以備提交的變更:
  (使用 "git add <文件>..." 更新要提交的內(nèi)容)
  (使用 "git checkout -- <文件>..." 丟棄工作區(qū)的改動(dòng))

    修改:     readme.md

未跟蹤的文件:
  (使用 "git add <文件>..." 以包含要提交的內(nèi)容)

    listen

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

可以很清晰的看到,一個(gè)修改,一個(gè)為被追蹤!然后我們分別兩次執(zhí)行下 git add 命令:

twitch@laravel:~/learngit$ git add readme.md
twitch@laravel:~/learngit$ git add listen
twitch@laravel:~/learngit$ git status
位于分支 master
要提交的變更:
  (使用 "git reset HEAD <文件>..." 以取消暫存)

    新文件:   listen
    修改:     readme.md

git add命令實(shí)際上就是把要提交的所有修改放到暫存區(qū)(Stage)饵史,然后,執(zhí)行g(shù)it commit就可以一次性把暫存區(qū)的所有修改提交到分支。這樣就清晰的明白了暫存區(qū)了吧!

twitch@laravel:~/learngit$ git commit -m "understand how stage works"
[master f56fcb6] understand how stage works
 2 files changed, 3 insertions(+), 1 deletion(-)
 create mode 100644 listen
twitch@laravel:~/learngit$ git status
 位于分支 master
 無(wú)文件要提交胳喷,干凈的工作區(qū)

管理修改

為什么Git比其他版本控制系統(tǒng)設(shè)計(jì)得優(yōu)秀湃番,因?yàn)镚it跟蹤并管理的是修改,而非文件吭露。
你新增了一行吠撮,這就是一個(gè)修改,刪除了一行讲竿,也是一個(gè)修改泥兰,更改了某些字符,也是一個(gè)修改题禀,刪了一些又加了一些鞋诗,也是一個(gè)修改,甚至創(chuàng)建一個(gè)新文件迈嘹,也算一個(gè)修改削彬。

git commit 只會(huì)對(duì) 暫存區(qū)里的文件進(jìn)行提交!

撤銷修改

在修改過(guò)某個(gè)文件后,你使用 git status 命令可以清晰看到git 的給你的提示信息,其中就有一個(gè);
使用 "git checkout -- <文件>..." 丟棄工作區(qū)的改動(dòng)

twitch@laravel:~/learngit$ git status
位于分支 master
尚未暫存以備提交的變更:
  (使用 "git add <文件>..." 更新要提交的內(nèi)容)
  (使用 "git checkout -- <文件>..." 丟棄工作區(qū)的改動(dòng))

    修改:     listen

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

一般有兩種情況出現(xiàn):

  • 1、文件修改后還沒有被放到暫存區(qū)秀仲,現(xiàn)在融痛,撤銷修改就回到和版本庫(kù)一模一樣的狀態(tài);
  • 2啄育、文件修改后已經(jīng)添加到暫存區(qū)后酌心,又作了修改,現(xiàn)在挑豌,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)安券。
    總之,就是讓這個(gè)文件回到最近一次git commit或git add時(shí)的狀態(tài)氓英。

git checkout -- file命令中的--很重要侯勉,沒有--,就變成了“切換到另一個(gè)分支”的命令!

另一個(gè)撤銷的方法: git reset HEAD file(文件名)可以把暫存區(qū)的修改撤銷掉(unstage)铝阐,重新放回工作區(qū)
git reset命令既可以回退版本址貌,也可以把暫存區(qū)的修改回退到工作區(qū)。當(dāng)我們用HEAD時(shí)徘键,表示最新的版本练对。

刪除文件

在Git里,刪除一個(gè)文件也是一個(gè)修改操作!

工作區(qū)刪除文件

twitch@laravel:~/learngit$ rm test.txt
twitch@laravel:~/learngit$ git status
位于分支 master
尚未暫存以備提交的變更:
  (使用 "git add/rm <文件>..." 更新要提交的內(nèi)容)
  (使用 "git checkout -- <文件>..." 丟棄工作區(qū)的改動(dòng))

    刪除:     test.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

很清晰的提示給你有兩個(gè)選擇,一是從版本庫(kù)刪除,使用 "git rm "并且提交,二是撤銷刪除,使用 " git checkput -- filename"!

遠(yuǎn)程倉(cāng)庫(kù)


以 Github 作為 遠(yuǎn)程倉(cāng)庫(kù)

第一步、創(chuàng)建SSH Key
本地Git倉(cāng)庫(kù)和GitHub倉(cāng)庫(kù)之間的傳輸是通過(guò)SSH加密的,所以需要帶著鑰匙來(lái)訪問(wèn)!首先看下你用戶主目錄下有沒有一個(gè)隱藏的".ssh"目錄,該目錄下有沒有id_rsa和id_rsa.pub兩個(gè)文件;有的話就說(shuō)明你已經(jīng)擁有了鑰匙 和 鎖!

創(chuàng)建 SSH Key:
twitch@laravel:~/learngit$ ssh-keygen -t rsa -C "342766475@qq.com"
Generating public/private rsa key pair. // 生成公共/私有密鑰對(duì)
Enter file in which to save the key (/home/twitch/.ssh/id_rsa): // 輸入保存鍵的文件 文件名 默認(rèn)就行!
Enter passphrase (empty for no passphrase):   //輸入密碼(無(wú)密碼為空): (默認(rèn)就行)
Enter same passphrase again:
Your identification has been saved in /home/twitch/.ssh/id_rsa.
Your public key has been saved in /home/twitch/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:tRogpxgwX0eYczLbjAT7jGsqwwdxvaeY8ZiP3n+Wb3I 342766475@qq.com
The key's randomart image is:
+---[RSA 2048]----+
|o ...+o          |
| + oB..          |
|  +.oXo   .      |
| . Bo=o. . .     |
|  = + . S .      |
| . o . . o       |
|. + B o . .      |
|o+ *oo   = E     |
|o.oo.o..o =.     |
+----[SHA256]-----+

可以看到".ssh目錄下生成了兩個(gè)文件:" id_rsa和id_rsa.pub,id_rsa是私鑰吹害,不能泄露出去螟凭,id_rsa.pub是公鑰,可以放心地告訴任何人它呀。

第二步螺男、登陸GitHub棒厘,打開“settings”,“SSH and GPG Keys”頁(yè)面

然后下隧,點(diǎn)“New SSH Key”奢人,填上任意Title,在Key文本框里粘貼id_rsa.pub文件的內(nèi)容就ok了,確認(rèn)添加就好了!

第三步淆院、在GitHub添加遠(yuǎn)程庫(kù)

本地創(chuàng)建了一個(gè)Git倉(cāng)庫(kù)后何乎,又想在GitHub創(chuàng)建一個(gè)Git倉(cāng)庫(kù),并且讓這兩個(gè)倉(cāng)庫(kù)進(jìn)行遠(yuǎn)程同步迫筑,這樣宪赶,GitHub上的倉(cāng)庫(kù)既可以作為備份,又可以讓其他人通過(guò)該倉(cāng)庫(kù)來(lái)協(xié)作脯燃,真是一舉多得搂妻。

首先,GitHub 點(diǎn)擊右上角"+"的符號(hào),找到 new repository!創(chuàng)建好后這個(gè)倉(cāng)庫(kù),learngit倉(cāng)庫(kù)還是空的,GitHub告訴我們辕棚,可以從這個(gè)倉(cāng)庫(kù)克隆出新的倉(cāng)庫(kù)欲主,也可以把一個(gè)已有的本地倉(cāng)庫(kù)與之關(guān)聯(lián),然后逝嚎,把本地倉(cāng)庫(kù)的內(nèi)容推送到GitHub倉(cāng)庫(kù)扁瓢。

遠(yuǎn)程倉(cāng)庫(kù)與本地倉(cāng)庫(kù)關(guān)聯(lián) 使用命令"git remote -h"查看相關(guān)命令幫助!

twitch@laravel:~/learngit$ git remote add origin git@github.com:Twitchboy/leanergit.git  // 通過(guò)SSH通道關(guān)聯(lián)
twitch@laravel:~/learngit$ clear

twitch@laravel:~/learngit$ git push -u origin master                                    // 推送把本地庫(kù)的所有內(nèi)容推送到遠(yuǎn)程庫(kù)上
The authenticity of host 'github.com (192.30.253.112)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.112' (RSA) to the list of known hosts.
對(duì)象計(jì)數(shù)中: 15, 完成.
Delta compression using up to 4 threads.
壓縮對(duì)象中: 100% (12/12), 完成.
寫入對(duì)象中: 100% (15/15), 1.22 KiB | 0 bytes/s, 完成.
Total 15 (delta 4), reused 0 (delta 0)
remote: Resolving deltas: 100% (4/4), done.
To git@github.com:Twitchboy/leanergit.git
 * [new branch]      master -> master
分支 master 設(shè)置為跟蹤來(lái)自 origin 的遠(yuǎn)程分支 master。

由于遠(yuǎn)程庫(kù)是空的补君,我們第一次推送master分支時(shí)引几,加上了 -u 參數(shù),Git不但會(huì)把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支挽铁,還會(huì)把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來(lái)伟桅,在以后的推送或者拉取時(shí)就可以簡(jiǎn)化命令。

推送成功后,遠(yuǎn)程倉(cāng)庫(kù)就和本地倉(cāng)庫(kù)內(nèi)容一致了!從現(xiàn)在起叽掘,只要本地作了提交楣铁,就可以通過(guò)命令:

twitch@laravel:~/learngit$ git push origin master

SSH警告!

當(dāng)你第一次使用Git的clone或者push命令連接GitHub時(shí),會(huì)得到一個(gè)警告:

twitch@laravel:~/learngit$ git push -u origin master
The authenticity of host 'github.com (192.30.253.112)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. //如果你實(shí)在擔(dān)心有人冒充GitHub服務(wù)器更扁,輸入yes前可以對(duì)照GitHub的RSA Key的指紋信息是否與SSH連接給出的一致盖腕。
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.112' (RSA) to the list of known hosts.  //Git會(huì)輸出一個(gè)警告,告訴你已經(jīng)把GitHub的Key添加到本機(jī)的一個(gè)信任列表里了:只會(huì)出現(xiàn)一次!

這是因?yàn)镚it使用SSH連接浓镜,而SSH連接在第一次驗(yàn)證GitHub服務(wù)器的Key時(shí)溃列,需要你確認(rèn)GitHub的Key的指紋信息是否真的來(lái)自GitHub的服務(wù)器,輸入yes回車即可膛薛。

從遠(yuǎn)程倉(cāng)庫(kù)克隆

第一步听隐、先創(chuàng)建遠(yuǎn)程倉(cāng)庫(kù)
勾選Initialize this repository with a README,這樣GitHub會(huì)自動(dòng)為我們創(chuàng)建一個(gè)README.md文件相叁。創(chuàng)建完畢后遵绰,可以看到README.md文件.

第二步、克隆到本地倉(cāng)庫(kù)

twitch@laravel:~$ git clone git@github.com:Twitchboy/gitnote.git
正克隆到 'gitnote'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
接收對(duì)象中: 100% (3/3), 完成.
檢查連接... 完成增淹。
twitch@laravel:~$ cd gitnote
twitch@laravel:~/gitnote$ ls
README.md

你也許還注意到椿访,GitHub給出的地址不止一個(gè),還可以用https://github.com/michaelliao/gitskills.git這樣的地址虑润。實(shí)際上成玫,Git支持多種協(xié)議,默認(rèn)的git://使用ssh拳喻,但也可以使用https等其他協(xié)議哭当。

使用https除了速度慢以外,還有個(gè)最大的麻煩是每次推送都必須輸入口令冗澈,但是在某些只開放http端口的公司內(nèi)部就無(wú)法使用ssh協(xié)議而只能用https钦勘。

分支管理


分支簡(jiǎn)介

分支就是科幻電影里面的平行宇宙,當(dāng)你正在電腦前努力學(xué)習(xí)Git的時(shí)候亚亲,另一個(gè)你正在另一個(gè)平行宇宙里努力學(xué)習(xí)SVN彻采。

如果兩個(gè)平行宇宙互不干擾,那對(duì)現(xiàn)在的你也沒啥影響捌归。不過(guò)肛响,在某個(gè)時(shí)間點(diǎn),兩個(gè)平行宇宙合并了惜索,結(jié)果特笋,你既學(xué)會(huì)了Git又學(xué)會(huì)了SVN!

什么是分支?

分支在實(shí)際中有什么用呢巾兆?假設(shè)你準(zhǔn)備開發(fā)一個(gè)新功能猎物,但是需要兩周才能完成,第一周你寫了50%的代碼臼寄,如果立刻提交霸奕,由于代碼還沒寫完,不完整的代碼庫(kù)會(huì)導(dǎo)致別人不能干活了吉拳。如果等代碼全部寫完再一次提交质帅,又存在丟失每天進(jìn)度的巨大風(fēng)險(xiǎn)。

現(xiàn)在有了分支留攒,就不用怕了煤惩。你創(chuàng)建了一個(gè)屬于你自己的分支,別人看不到炼邀,還繼續(xù)在原來(lái)的分支上正常工作魄揉,而你在自己的分支上干活,想提交就提交拭宁,直到開發(fā)完畢后洛退,再一次性合并到原來(lái)的分支上瓣俯,這樣,既安全兵怯,又不影響別人工作彩匕。

優(yōu)點(diǎn): Git的分支是與眾不同的,無(wú)論創(chuàng)建、切換和刪除分支,Git在1秒鐘之內(nèi)就能完成艘儒!無(wú)論你的版本庫(kù)是1個(gè)文件還是1萬(wàn)個(gè)文件。

創(chuàng)建與合并分支

在版本回退里绪爸,你已經(jīng)知道,每次提交宙攻,Git都把它們串成一條時(shí)間線奠货,這條時(shí)間線就是一個(gè)分支。截止到目前座掘,只有一條時(shí)間線仇味,在Git里,這個(gè)分支叫主分支雹顺,即master分支丹墨。HEAD嚴(yán)格來(lái)說(shuō)不是指向提交,而是指向master嬉愧,master才是指向提交的贩挣,所以,HEAD指向的就是當(dāng)前分支没酣。

一開始的時(shí)候王财,master分支是一條線,Git用master指向最新的提交裕便,再用HEAD指向master绒净,就能確定當(dāng)前分支,以及當(dāng)前分支的提交點(diǎn):
HEAD(當(dāng)前版本) -> master -> 最新的提交

分支思維導(dǎo)圖

當(dāng)我們創(chuàng)建新的分支偿衰,例如dev時(shí)挂疆,Git新建了一個(gè)指針叫dev,指向master相同的提交下翎,再把HEAD指向dev缤言,就表示當(dāng)前分支在 dev 上:

創(chuàng)建了一個(gè)分支

你看,Git創(chuàng)建一個(gè)分支很快视事,因?yàn)槌嗽黾右粋€(gè)dev指針胆萧,改改HEAD的指向,工作區(qū)的文件都沒有任何變化俐东!

不過(guò)跌穗,從現(xiàn)在開始订晌,對(duì)工作區(qū)的修改和提交就是針對(duì)dev分支了,比如新提交一次后蚌吸,dev指針往前移動(dòng)一步腾仅,而master指針不變:

再次修改和提交都是給予分支dev上的!

合并

假如我們?cè)赿ev上的工作完成了,就可以把dev合并到master上套利。Git怎么合并呢?最簡(jiǎn)單的方法鹤耍,就是直接把master指向dev的當(dāng)前提交肉迫,就完成了合并:

最簡(jiǎn)單的,master 指向到 dev 分支上

合并完分支后,甚至可以刪除dev分支稿黄。刪除dev分支就是把dev指針給刪掉喊衫,刪掉后,我們就剩下了一條master分支:

實(shí)操下:

創(chuàng)建分支

twitch@laravel:~/learngit$ git branch            // 查看當(dāng)前分支
* master                                         
twitch@laravel:~/learngit$ git checkout -b dev   // 創(chuàng)建了一個(gè)分支,并且切換到 dev分支上
M   listen
D   test.txt
切換到一個(gè)新分支 'dev'
twitch@laravel:~/learngit$ git branch           // 當(dāng)前分支就在 dev 上了  
* dev
  master

在dev分支上修改readme.md 文件,并合并分支

twitch@laravel:~/learngit$ vim readme.md  
twitch@laravel:~/learngit$ git add readme.md        
twitch@laravel:~/learngit$ git commit -m "Branch test"    
[dev 347f60e] Branch test
 1 file changed, 2 insertions(+)

 // 分支提交完,我們來(lái)看看 主分支有變化沒!
 twitch@laravel:~/learngit$ git checkout master
 切換到分支 'master'
 您的分支與上游分支 'origin/master' 一致

// 切換回master分支后杆怕,再查看一個(gè)readme.txt文件族购,剛才添加的內(nèi)容不見了!因?yàn)槟莻€(gè)提交是在dev分支上陵珍,而master分支此刻的提交點(diǎn)并沒有變:

思維導(dǎo)圖

分支合并

twitch@laravel:~/learngit$ git merge dev
更新 1af2398..347f60e
Fast-forward
 readme.md | 2 ++
 1 file changed, 2 insertions(+)

git merge命令用于合并指定分支到當(dāng)前分支寝杖。合并后,再查看readme.txt的內(nèi)容互纯,就可以看到瑟幕,和dev分支的最新提交是完全一樣的。
注意 到上面的Fast-forward信息留潦,Git告訴我們只盹,這次合并是“快進(jìn)模式”,也就是直接把master指向dev的當(dāng)前提交兔院,所以合并速度非持潮埃快。

刪除dev分支

twitch@laravel:~/learngit$ git branch -d dev
已刪除分支 dev(曾為 347f60e)坊萝。
twitch@laravel:~/learngit$ git branch
* master

因?yàn)閯?chuàng)建孵稽、合并和刪除分支非常快十偶,所以Git鼓勵(lì)你使用分支完成某個(gè)任務(wù)肛冶,合并后再刪掉分支,這和直接在master分支上工作效果是一樣的扯键,但過(guò)程更安全睦袖。

解決沖突

我們來(lái)創(chuàng)建一個(gè)沖突
新分支 featurel 下,修改 file1.txt 文件,然后切回 master 分支上,也進(jìn)行修改同一個(gè)文件 file1.txt 同一行,然后提交!最后在合并看看!

twitch@laravel:~/learngit$ git checkout -b featurel
M   listen
D   test.txt
切換到一個(gè)新分支 'featurel'
twitch@laravel:~/learngit$ git branch
* featurel
  master
twitch@laravel:~/learngit$ vim file1.txt
twitch@laravel:~/learngit$ git add file1.txt
twitch@laravel:~/learngit$ git commit -m "AND simple"
[featurel 7887db5] AND simple
 1 file changed, 2 insertions(+)
twitch@laravel:~/learngit$ git checkout master
M   listen
D   test.txt
切換到分支 'master'
您的分支領(lǐng)先 'origin/master' 共 1 個(gè)提交。
  (使用 "git push" 來(lái)發(fā)布您的本地提交)
twitch@laravel:~/learngit$ vim file1.txt
twitch@laravel:~/learngit$ git add file1.txt
twitch@laravel:~/learngit$ git commit -m "& simple"
[master 88ea4c7] & simple
 1 file changed, 1 insertion(+)
 twitch@laravel:~/learngit$ git merge featurel
 自動(dòng)合并 file1.txt
 沖突(內(nèi)容):合并沖突于 file1.txt
 自動(dòng)合并失敗荣刑,修正沖突然后提交修正的結(jié)果馅笙。

果然沖突了伦乔!Git告訴我們,readme.txt文件存在沖突董习,必須手動(dòng)解決沖突后再提交烈和。git status也可以告訴我們沖突的文件:

twitch@laravel:~/learngit$ git status
位于分支 master
您的分支領(lǐng)先 'origin/master' 共 2 個(gè)提交。
  (使用 "git push" 來(lái)發(fā)布您的本地提交)
您有尚未合并的路徑皿淋。
  (解決沖突并運(yùn)行 "git commit")

未合并的路徑:
  (使用 "git add <文件>..." 標(biāo)記解決方案)

    雙方修改:   file1.txt

直接查看file1.txt的內(nèi)容:

<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
1招刹、
Creating a new branch is quick AND simple.
>>>>>>> featurel

Git用<<<<<<<,=======窝趣,>>>>>>>標(biāo)記出不同分支的內(nèi)容疯暑,手動(dòng)修改成 我們想要的!再保存下!

twitch@laravel:~/learngit$ git log --graph --pretty=oneline --abbrev-commit
*   488db75 conflict fixed
|\  
| * 7887db5 AND simple
* | 88ea4c7 & simple
|/  
* 347f60e Branch test
* 1af2398 add test.txt
* f56fcb6 understand how stage works
* fa65c67 add distributed!
* fa7ab77 add three files
* 89293b9 wrote a readme file

刪除分支

twitch@laravel:~/learngit$ git branch -d featurel
已刪除分支 featurel(曾為 7887db5)。

分支管理策略

合并分支有兩種模式:

  • 1哑舒、fast forward 模式妇拯,合并后,刪除分支洗鸵,分支信息將會(huì)丟掉越锈。
  • 2、普通模式 合并時(shí)添加 參數(shù): "--no-ff" ,合并(merge)時(shí)生成一個(gè)新的commit,這樣分支歷史上就可以看到分支信息

合并分支時(shí)膘滨,加上--no-ff參數(shù)就可以用普通模式合并甘凭,合并后的歷史有分支,能看出來(lái)曾經(jīng)做過(guò)合并火邓,而fast forward合并就看不出來(lái)曾經(jīng)做過(guò)合并对蒲。
實(shí)操:

twitch@laravel:~/learngit$ git checkout -d dev
twitch@laravel:~/learngit$ vim file2.txt
twitch@laravel:~/learngit$ git add file2.txt
twitch@laravel:~/learngit$ git commit -m 'add file2 1'
twitch@laravel:~/learngit$ git checkout master
twitch@laravel:~/learngit$ git vim file2.txt
twitch@laravel:~/learngit$ git add file2.txt
twitch@laravel:~/learngit$ git commit -m "add file2 2"
twitch@laravel:~/learngit$ git merge --no-ff -m "merge with --no-ff" dev

有一個(gè)沖突!

twitch@laravel:~/learngit$ git log --graph --pretty=oneline --abbrev-commit
*   e3fb75f merge --no-ff
|\  
| * 5125905 add file2.txt 1
* | 3942b60 add file2
* | fcd3074 add file2.txt
|/  
* 439b640 change2
* 23a53ed change
*   488db75 conflict fixed
|\  
| * 7887db5 AND simple
* | 88ea4c7 & simple
|/  
* 347f60e Branch test
* 1af2398 add test.txt
* f56fcb6 understand how stage works
* fa65c67 add distributed!
* fa7ab77 add three files
* 89293b9 wrote a readme file

可以看到,不使用Fast forward模式贡翘,merge后就像這樣:

merge --no-ff

分支策略

在實(shí)際開發(fā)中蹈矮,我們應(yīng)該按照幾個(gè)基本原則進(jìn)行分支管理:

首先,master分支應(yīng)該是非常穩(wěn)定的鸣驱,也就是僅用來(lái)發(fā)布新版本泛鸟,平時(shí)不能在上面干活;

那在哪干活呢踊东?干活都在dev分支上北滥,也就是說(shuō),dev分支是不穩(wěn)定的闸翅,到某個(gè)時(shí)候再芋,比如1.0版本發(fā)布時(shí),再把dev分支合并到master上坚冀,在master分支發(fā)布1.0版本济赎;

你和你的小伙伴們每個(gè)人都在dev分支上干活,每個(gè)人都有自己的分支,時(shí)不時(shí)地往dev分支上合并就可以了司训。

所以构捡,團(tuán)隊(duì)合作的分支看起來(lái)就像這樣:

團(tuán)隊(duì)的分支結(jié)構(gòu)圖

多人協(xié)作

要查看遠(yuǎn)程庫(kù)的信息,用git remote: (默認(rèn):origin)

twitch@laravel:~/learngit$ git remote
origin

用git remote -v顯示更詳細(xì)的信息:

twitch@laravel:~/learngit$ git remote -v
origin  git@github.com:Twitchboy/leanergit.git (fetch)
origin  git@github.com:Twitchboy/leanergit.git (push)

上面顯示了可以抓取和推送的origin的地址壳猜。如果沒有推送權(quán)限勾徽,就看不到push的地址

推送分支

推送分支,就是把該分支上的所有本地提交推送到遠(yuǎn)程庫(kù)统扳。推送時(shí)喘帚,要指定本地分支,這樣咒钟,Git就會(huì)把該分支推送到遠(yuǎn)程庫(kù)對(duì)應(yīng)的遠(yuǎn)程分支上:

twitch@laravel:~/learngit$ git push origin master
Everything up-to-date
已是最新更新的了

如果要推送其他分支吹由,比如dev,就改成:

twitch@laravel:~/learngit$ git push origin dev

但是盯腌,并不是一定要把本地分支往遠(yuǎn)程推送,那么陨瘩,哪些分支需要推送腕够,哪些不需要呢?

  • master分支是主分支舌劳,因此要時(shí)刻與遠(yuǎn)程同步帚湘;

  • dev分支是開發(fā)分支,團(tuán)隊(duì)所有成員都需要在上面工作甚淡,所以也需要與遠(yuǎn)程同步大诸;

  • bug分支只用于在本地修復(fù)bug,就沒必要推到遠(yuǎn)程了贯卦,除非老板要看看你每周到底修復(fù)了幾個(gè)bug资柔;

  • feature分支是否推到遠(yuǎn)程,取決于你是否和你的小伙伴合作在上面開發(fā)撵割。

抓取分支

多人協(xié)作時(shí)贿堰,大家都會(huì)往master和dev分支上推送各自的修改。
現(xiàn)在啡彬,模擬一個(gè)你的小伙伴羹与,可以在另一臺(tái)電腦(注意要把SSH Key添加到GitHub)或者同一臺(tái)電腦的另一個(gè)目錄下克隆:

twitch@laravel:~/test$ git clone git@github.com:Twitchboy/leanergit.git
正克隆到 'leanergit'...
remote: Counting objects: 48, done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 48 (delta 15), reused 47 (delta 14), pack-reused 0
接收對(duì)象中: 100% (48/48), 6.69 KiB | 0 bytes/s, 完成.
處理 delta 中: 100% (15/15), 完成.
檢查連接... 完成庶灿。
twitch@laravel:~/test$ ls
leanergit

當(dāng)你的小伙伴從遠(yuǎn)程庫(kù)clone時(shí)纵搁,默認(rèn)情況下,你的小伙伴只能看到本地的master分支往踢。不信可以用git branch命令看看:

twitch@laravel:~/test/leanergit$ git branch
* master

現(xiàn)在腾誉,你的小伙伴要在dev分支上開發(fā),就必須創(chuàng)建遠(yuǎn)程origin的dev分支到本地,于是他用這個(gè)命令創(chuàng)建本地dev分支:

twitch@laravel:~/test/leanergit$ git checkout -b dev origin/dev
分支 dev 設(shè)置為跟蹤來(lái)自 origin 的遠(yuǎn)程分支 dev妄辩。
切換到一個(gè)新分支 'dev'

現(xiàn)在惑灵,就可以在dev上繼續(xù)修改,然后眼耀,時(shí)不時(shí)地把dev分支push到遠(yuǎn)程

twitch@laravel:~/test/leanergit$ git add file4.txt
twitch@laravel:~/test/leanergit$ git status
位于分支 dev
您的分支與上游分支 'origin/dev' 一致英支。
要提交的變更:
  (使用 "git reset HEAD <文件>..." 以取消暫存)

    修改:     file4.txt
twitch@laravel:~/test/leanergit$ git push
  warning: push.default 尚未設(shè)置,它的默認(rèn)值在 Git 2.0 已從 'matching'
  變更為 'simple'哮伟。若要不再顯示本信息并保持傳統(tǒng)習(xí)慣干花,進(jìn)行如下設(shè)置:

    git config --global push.default matching

  若要不再顯示本信息并從現(xiàn)在開始采用新的使用習(xí)慣,設(shè)置:

    git config --global push.default simple

  當(dāng) push.default 設(shè)置為 'matching' 后楞黄,git 將推送和遠(yuǎn)程同名的所有
  本地分支池凄。

  從 Git 2.0 開始,Git 默認(rèn)采用更為保守的 'simple' 模式鬼廓,只推送當(dāng)前
  分支到遠(yuǎn)程關(guān)聯(lián)的同名分支肿仑,即 'git push' 推送當(dāng)前分支。

  參見 'git help config' 并查找 'push.default' 以獲取更多信息碎税。
  ('simple' 模式由 Git 1.7.11 版本引入尤慰。如果您有時(shí)要使用老版本的 Git,
  為保持兼容雷蹂,請(qǐng)用 'current' 代替 'simple')

  對(duì)象計(jì)數(shù)中: 3, 完成.
  Delta compression using up to 4 threads.
  壓縮對(duì)象中: 100% (2/2), 完成.
  寫入對(duì)象中: 100% (3/3), 289 bytes | 0 bytes/s, 完成.
  Total 3 (delta 1), reused 0 (delta 0)
  remote: Resolving deltas: 100% (1/1), completed with 1 local objects.
  To git@github.com:Twitchboy/leanergit.git
     74de2bf..7e01dea  dev -> dev

這里推送是往github上推送!要是你的也同做了這個(gè)事件,你的推送就會(huì)失敗!

twitch@laravel:~/learngit$ git push origin dev
To git@github.com:Twitchboy/leanergit.git
 ! [rejected]        dev -> dev (fetch first)
error: 無(wú)法推送一些引用到 'git@github.com:Twitchboy/leanergit.git'
提示:更新被拒絕伟端,因?yàn)檫h(yuǎn)程倉(cāng)庫(kù)包含您本地尚不存在的提交。這通常是因?yàn)榱硗?提示:一個(gè)倉(cāng)庫(kù)已向該引用進(jìn)行了推送匪煌。再次推送前责蝠,您可能需要先整合遠(yuǎn)程變更
提示:(如 'git pull ...')。
提示:詳見 'git push --help' 中的 'Note about fast-forwards' 小節(jié)萎庭。

推送失敗霜医,因?yàn)槟愕男』锇榈淖钚绿峤缓湍阍噲D推送的提交有沖突,解決辦法也很簡(jiǎn)單驳规,Git已經(jīng)提示我們支子,先用git pull把最新的提交從origin/dev抓下來(lái),然后达舒,在本地合并值朋,解決沖突,再推送:

twitch@laravel:~/learngit$ git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0
展開對(duì)象中: 100% (3/3), 完成.
來(lái)自 github.com:Twitchboy/leanergit
   74de2bf..7e01dea  dev        -> origin/dev
   There is no tracking information for the current branch.
   Please specify which branch you want to merge with.
   See git-pull(1) for details

       git pull <remote> <branch>

   If you wish to set tracking information for this branch you can do so with:

       git branch --set-upstream dev origin/<branch>

git pull也失敗了巩搏,原因是沒有指定本地dev分支與遠(yuǎn)程origin/dev分支的鏈接昨登,根據(jù)提示,設(shè)置dev和origin/dev的鏈接

twitch@laravel:~/learngit$ git branch --set-upstream-to origin/dev
分支 dev 設(shè)置為跟蹤來(lái)自 origin 的遠(yuǎn)程分支 dev贯底。

再進(jìn)行 git pull

twitch@laravel:~/learngit$ git pull
自動(dòng)合并 file4.txt
沖突(內(nèi)容):合并沖突于 file4.txt
自動(dòng)合并失敗丰辣,修正沖突然后提交修正的結(jié)果撒强。

這回git pull成功,但是合并有沖突笙什,需要手動(dòng)解決飘哨,解決的方法和分支管理中的解決沖突完全一樣。解決后琐凭,提交芽隆,再push:

twitch@laravel:~/learngit$ git add file4.txt
twitch@laravel:~/learngit$ git commit -m "merge & fix file4.txt"
[dev 452314c] merge & fix file4.txt
twitch@laravel:~/learngit$ clear

twitch@laravel:~/learngit$ git push
warning: push.default 尚未設(shè)置,它的默認(rèn)值在 Git 2.0 已從 'matching'
變更為 'simple'统屈。若要不再顯示本信息并保持傳統(tǒng)習(xí)慣胚吁,進(jìn)行如下設(shè)置:

  git config --global push.default matching

若要不再顯示本信息并從現(xiàn)在開始采用新的使用習(xí)慣,設(shè)置:

  git config --global push.default simple

當(dāng) push.default 設(shè)置為 'matching' 后愁憔,git 將推送和遠(yuǎn)程同名的所有
本地分支腕扶。

從 Git 2.0 開始,Git 默認(rèn)采用更為保守的 'simple' 模式吨掌,只推送當(dāng)前
分支到遠(yuǎn)程關(guān)聯(lián)的同名分支半抱,即 'git push' 推送當(dāng)前分支。

參見 'git help config' 并查找 'push.default' 以獲取更多信息膜宋。
('simple' 模式由 Git 1.7.11 版本引入窿侈。如果您有時(shí)要使用老版本的 Git,
為保持兼容激蹲,請(qǐng)用 'current' 代替 'simple')

對(duì)象計(jì)數(shù)中: 5, 完成.
Delta compression using up to 4 threads.
壓縮對(duì)象中: 100% (4/4), 完成.
寫入對(duì)象中: 100% (5/5), 524 bytes | 0 bytes/s, 完成.
Total 5 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 1 local objects.
To git@github.com:Twitchboy/leanergit.git
   7e01dea..452314c  dev -> dev

因此棉磨,多人協(xié)作的工作模式通常是這樣:

  • 首先江掩,可以試圖用git push origin branch-name推送自己的修改学辱;

  • 如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新环形,需要先用git pull試圖合并策泣;

  • 如果合并有沖突,則解決沖突抬吟,并在本地提交萨咕;

  • 沒有沖突或者解決掉沖突后,再用git push origin branch-name推送就能成功火本!

  • 如果git pull提示“no tracking information”危队,則說(shuō)明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建,用命令git branch --set-upstream-to branch-name origin/branch-name钙畔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茫陆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子擎析,更是在濱河造成了極大的恐慌簿盅,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異桨醋,居然都是意外死亡棚瘟,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門喜最,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)偎蘸,“玉大人,你說(shuō)我怎么就攤上這事返顺≠骺啵” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵遂鹊,是天一觀的道長(zhǎng)振乏。 經(jīng)常有香客問(wèn)我,道長(zhǎng)秉扑,這世上最難降的妖魔是什么慧邮? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮舟陆,結(jié)果婚禮上误澳,老公的妹妹穿的比我還像新娘。我一直安慰自己秦躯,他們只是感情好忆谓,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著踱承,像睡著了一般倡缠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茎活,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天昙沦,我揣著相機(jī)與錄音,去河邊找鬼载荔。 笑死盾饮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的懒熙。 我是一名探鬼主播丘损,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼工扎!你這毒婦竟也來(lái)了徘钥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤定庵,失蹤者是張志新(化名)和其女友劉穎吏饿,沒想到半個(gè)月后踪危,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猪落,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年贞远,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笨忌。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蓝仲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出官疲,到底是詐尸還是另有隱情袱结,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布途凫,位于F島的核電站垢夹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏维费。R本人自食惡果不足惜果元,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望犀盟。 院中可真熱鬧而晒,春花似錦、人聲如沸阅畴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贱枣。三九已至监署,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冯事,已是汗流浹背焦匈。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工血公, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昵仅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓累魔,卻偏偏與公主長(zhǎng)得像摔笤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垦写,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • Git教程 一吕世、Git簡(jiǎn)介 1.1. Git的誕生1.2.集中式的vs分布式 二、安裝Git 三梯投、創(chuàng)建版本庫(kù) 四命辖、...
    曹淵說(shuō)創(chuàng)業(yè)閱讀 935評(píng)論 0 2
  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,631評(píng)論 9 163
  • git學(xué)習(xí)筆記 聲明 本文是本人學(xué)習(xí)Git過(guò)程中所做的筆記,以便日后查閱,文中多有錯(cuò)漏之處,不建議用作學(xué)習(xí)材料,文...
    sayonara_yoyo閱讀 674評(píng)論 0 1
  • 那時(shí)候和現(xiàn)在不一樣况毅,未來(lái)也和現(xiàn)在不一樣
    Wind季閱讀 187評(píng)論 0 0
  • 從小就被人說(shuō)沒有審美。 好嘛那我培養(yǎng)不就是了6А尔许! 1、橫终娃、縱位構(gòu)圖 2味廊、三角形構(gòu)圖 3、對(duì)稱形構(gòu)圖 4.S形和斜線...
    老談_TX閱讀 357評(píng)論 2 2