對於初學者,首先要了解什麼是Git;爲什麼使用git;如何使用git;如git初始化配置,把本地項目提交到遠程github上。
官網下載git:https://git-scm.com/download/
一:git初始配置
空白處或者指定目錄下右擊“Git Bash Here”
在命令行輸入如下信息:$ git config --global user.name “You Name” 用戶名
$ git config --global user.email "[email protected]" 郵箱地址
因爲git是分佈式版本控制系統,所以需要填寫用戶名和郵箱作爲一個標識。注意git config --global 參數,有了這個參數,表示你這臺機器上所有的git倉庫都會使用這個配置,當然你也可以對某個倉庫指定不同的用戶名和郵箱。
查看git初始化配置:$ git config --list
備註:第一次使用git時必須有git賬號,因此首先需註冊git賬號,註冊賬號可以用命令行如上訴操作,也可以直接登錄github官網註冊。
二:創建倉庫
版本庫:又名倉庫,英文名repository,可以理解成一個目錄,這個目錄裏面的所有文件都可以被git管理起來,每個文件的修改,刪除git都跟蹤,以便任何時刻都可以追蹤歷史或者在將來某個時刻還可以將文件”還原“。
如在我本地windows環境下創建自己的倉庫
$ mkdir learnGit
$ cd learnGit
$pwd
pwd命令用於顯示當前目錄。
注意:在windows系統,爲了避免遇到各種莫名其妙的問題,請確保目錄名(包括父目錄)不含中文。
通過git init 命令把這個目錄變成git可以管理的倉庫。
$ git init
這樣倉庫就創建好了,而且告訴你是一個空的倉庫(empty Git repository)可以發現當前目錄下多了一個".git"目錄,這個目錄是 git來跟蹤管理版本庫的,不能手動修改這個目錄裏面的文件,否則會把git倉庫破壞了。如果你沒有看到".git"目錄,是因爲目錄默認是隱藏的,用ls -ah命令可以查看。
在創建的目錄learngit會看到一個隱藏文件夾”.git“
注意默認情況下是不顯示的,若是你想看到隱藏的文件夾則”工具“--”文件夾選項“--”查看“--”顯示隱藏的文件,文件夾或驅動器“
把文件添加到版本庫
首先要明確下,所有的版本控制系統,只能跟蹤文本文件的改動,比如txt文件,網頁,所有程序的代碼等,Git也不列外,版本控制系統可以告訴你每次的改動,但是圖片,視頻這些二進制文件,雖能也能由版本控制系統管理,但沒法跟蹤文件的變化,只能把二進制文件每次改動串起來,也就是知道圖片從1kb變成2kb,但是到底改了啥,版本控制也不知道。不幸的是,Microsoft的Word格式是二進制格式,因此,版本控制系統是沒法跟蹤Word文件的改動的,前面我們舉的例子只是爲了演示,如果要真正使用版本控制系統,就要以純文本方式編寫文件。因爲文本是有編碼的,比如中文有常用的GBK編碼,日文有Shift_JIS編碼,如果沒有歷史遺留問題,強烈建議使用標準的UTF-8編碼,所有語言使用同一種編碼,既沒有衝突,又被所有平臺所支持。
注意:千萬不要使用Windows自帶的記事本編輯任何文本文件。原因是Microsoft開發記事本的團隊使用了一個非常弱智的行爲來保存UTF-8編碼的文件,他們自作聰明地在每個文件開頭添加了0xefbbbf(十六進制)的字符,你會遇到很多不可思議的問題,比如,網頁第一行可能會顯示一個“?”,明明正確的程序一編譯就報語法錯誤,等等,都是由記事本的弱智行爲帶來的。建議你下載Notepad++或者editplus代替記事本,不但功能強大,而且免費!記得把Notepad++或editplus的默認編碼設置爲UTF-8 即可。
在新創建的倉庫”learngit“下創建文件”learngit.txt“,然後用文本編輯器editplus編寫一個learngit.txt內容如下:
Git is a version control system.
Git is free software.
注意:新創建的文件”learngit.txt“一定要放在learngit目錄下(子目錄也行)因爲這是一個git倉庫,放在其他地方git找不到這個文件。
用git add 告訴git,把文件添加到倉庫
$ git add learngit.txt
用git commit告訴git,把文件提交到倉庫。
$ git commit -m "write a learnGit file"
注意:-m後面輸入的是本次提交說明,可以輸入任何內容,最好輸入有意義的,做到見名思義,這樣你就能從歷史記錄裏方便找到改動記錄。若是嫌棄麻煩不想寫,可以,但是作爲一名開發人員,跟寫註釋一樣,方便他人,增強代碼閱讀性。
git commit命令執行成功後會告訴你,一個文件被改動了(添加的learnGit.txt)插入了兩行內容(learnGit.txt有兩行內容)。
爲什麼git添加文件需要add,commit一共兩步呢?因爲commit可以一次提交很多文件,所以可以多次add不同文件,如:
$git add file1.txt
$git add file2.txt file3.txt
$ git commmit -m "add three files"
注意提交文件一定要進行如上兩步git add git commit 否則提交不成功。原因下面會講到。
三:版本回退
成功添加並提交一個learngit.txt文件後,繼續修改learnit.txt文件,如下內容:
Git is a distributed version control system.
Git is fress software.
運行git status命令查看結果:
$ git status
git status命令可以讓我們掌握倉庫當前的狀態,上面的命令告訴我們,該文件被修改過了,但還沒有準備提交的修改。
雖然git告訴我們該文件被修改了,但如果能看看具體修改了什麼內容,自然是好的。比如你過段時間再次查看該文件,已經記不清上次怎麼修改learngit.txt,所以用git diff 命令查看。
$ git diff learngit.txt
git diff顧名思義就是查看difference,顯示的格式正式Unix通用的diff格式,可以從上面的命令輸出看到,我們在第一行添加了一個”distributed“單詞。知道了對learngit.txt做了什麼修改後,再把它提交到倉庫。提交修改和提交新文件是一樣兩步。
$ git add learngit.txt
同樣沒有任何輸出(說明操作正確)在執行第二步git commit之前,我們再運行git status看看當前倉庫狀態:
$ git status
git status命令告訴我們,將要被提交的修改包括learngit.txt這下就可以放心提交了。
$ git commit -m "add distributed"
提交後,我們再用git status命令查看倉庫當前狀態
$ git status
git 告訴我們當前沒有需要提交的修改,而且工作目錄是乾淨(working directory clean)的。
接下來我們繼續對文件修改,提交。
Git is a distributed version control system.
Git is free software distributed under the GPL.
然後提交:
$ git add learngit.txt
$ git commit -m "append GPL"
現在回顧下learnGit.txt一共有幾個版本提交到git倉庫:
版本一:write a learnGit file
Git is a version control system.
Git is free software.
版本二:add distributed
Git is a distributed version control system.
Git is free software.
版本三:append GPL
Git is a distributed version control system.
Git is free software distributed under the GPL.
當前,在實際開發中,我們會修改很多內容,肯定記不住那麼多內容。故我們用git log 命令查看。
$ git log
git log命令顯示從最近到最遠的提交日誌。若是嫌棄輸出信息太多,可以加“--pretty=oneline”參數:
$ git log --pretty=oneline
需要友情提示的是,你看大的一大串類似”a9615...46c0“的是commit id(版本號),和svn不一樣,git的commit id 不是1,2,3.....遞增的數字,而是 一個SHA1計算出來的一個非常大的數字,用十六進制表示,而且你看到的commit id和我肯定的不一樣,以自己的爲準。爲什麼commit id需要用那麼一大串數字表示呢?因爲git是分佈式版本控制系統。
現在我們想要git回退到我們想要的版本中,則git必須知道當前版本是哪個版本,在git中用“HEAD”表示當前版本,上一個版本“HEAD^”當然往上100個版本寫100個“^”比較容易寫不出來,所以寫成HEAD~100
現在,我們要把當前版本“append GPL”回退到上一個版本“add distributed”可以用git reset命令:
$ git reset --hard HEAD^
查看learngit.txt的內容是不是版本”add distributed“
$ cat learngit.txt
用git log再看看現在版本庫的狀態
$ git log
可以發現最新的那個版本append GPL 已經看不到了。要想回退到這個版本,只要你上面的命令沒有關閉,找到那個append GPL 的commit id 是"a9615a8",於是就可以指定回到某個版本:
$ git reset --hard a9615a8
版本號沒必要寫全,前幾位就可以git會自動去找。
再次查看learngit.txt內容
$ cat learngit.txt
果然,版本正常回退到你想要的版本中。
現在你回退到你想要的版本中,但是你關閉命令窗口或者關閉電腦怎麼辦呢?git提供了一個命令git reflog 用來記錄你的每一次命令:
$ git reflog
在該命令中你會看到不同版本都會有指定的commit id 。這樣你就可以回退到你想要的版本中了。
四:工作區和暫存區
git和其他版本控制系統如svn的一個不同之處就是有暫存區的概念。
工作區(working directory):就是在電腦能看到的目錄,如我的learngit文件夾就是一個工作區。
版本庫(repository):工作區有一個隱藏的目錄“.git”就是git的版本庫。
git的版本庫裏存了很多東西,其中最主要的就是稱爲stage的暫存區,還有git自動爲我們創建的第一個分支master以及指向master的一個指針HEAD
我們把文件往git版本添加的時候是分兩步執行的。
第一步git add 把文件添加進去,實際上就是把文件修改添加到暫存區的;
第二步git commit 提交修改,實際上就是把暫存區的所有內容提交到當前分支。
因爲我們創建git版本庫時,git自動爲我們創建唯一一個master分支,所以現在git commit 就是往master分支上提交更改。通俗點講需要提交的文件修改通通放到暫存區,一次性提交暫存區的所有修改。
如下操作:先對learngit.txt做個修改:
Git is a distributed version control system.
Git is free software distributed under the GPL
Git has a mutable index called stage.
然後在工作區新增一個“license”文件(內容隨便寫點什麼)
用git status 查看一下狀態:
$ git status
git 非常清楚的告訴我們,learngit.txt被修改了,而license還未被添加過,所以它的狀態爲“untracked”。
現在使用兩次命令git add 把learngit.txt license 都添加後用git status再查看下:
現在暫存區的狀態就變成了這樣:
所以git add 命令實際上就是把要提交的所有修改放到暫存區(stage),然後執行git commit就可以一次性把暫存區的所有修改提交到分支。
$ git commit -m "understand how stage work"
一旦提交後,如果你又沒有對工作區做任何修改,那麼工作區就是乾淨的。
$ git status
現在版本庫就變成了這樣,暫存區就沒有任何內容了:
這就是爲什麼提交文件必須執行 git add git commit 兩步,否則提交不成功。
五:撤銷和刪除文件
git跟蹤並管理的是修改而非文件。什麼是修改,就是你刪除一行,增加一行,新增一個文件等操作。爲什麼git管理是修改而不是文件呢?請看如下操作:
$ cat learngit.txt
Git is a distributed version control system.
Git is a free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes.
My stupid boss still prefers SVN.
用git status查看下:
$ git status
git告訴你,git checkout --file 可以丟棄工作區的修改:
$git checkout --learngit.txt
git checkout --learngit.txt意思就是把learn.git文件在工作區的修改全部撤銷。有兩種情況:
一種是learngit.txt自修改後還沒有被放到暫存區,現在撤銷修改就回到和版本一模一樣的狀態。
一種是learngit.txt已經添加到暫存區後又做了修改,現在撤銷修改就回到添加到暫存區後的狀態。
總之就是讓這個文件回到最近一次git commit 或git add 時的狀態。
查看learngit.txt文件內容:
$ cat learngit.txt
發現撤銷到 git add時的狀態。
注意:git checkout --file 命令中“--”很重要,沒有“--”就變成了“切換到另外一個分支的命令”。
再次修改learngit.txt然後git status查看狀態然後如下操作:
git告訴我們,命令git reset HEAD file 可以把暫存區的修改撤銷,重新放回工作區:
$ git reset HEAD learngit.txt
git reset 既可以回退版本也可以把暫存區的修改撤銷掉,重新放回工作區。當我們用HEAD時,表示最新的版本。
再用git status查看下,現在暫存區是乾淨的,工作區有修改:
$ git rm license.txt
$ git commit -m "remove license.txt"
git rm file 把文件從版本庫中刪除。如果一個文件已經被提交到版本庫,那麼你永遠不用擔心誤刪,但是要小心,你只能恢復到最新版本,你會丟失最近一次提交後你修改的內容。
若是你無意中刪除你不想刪除的文件,可以把刪除的恢復。
$ git checkout --lincese.txt
git checkout
其實是用版本庫裏的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
注意:撤銷刪除操作,必須是未git commit之前,若是你已經git commit那麼該操作無法實現
六:添加遠程倉庫
請在github官網註冊註冊自己的github賬號,官網地址:https://github.com/ 由於本地的git倉庫和github倉庫之間的傳輸是通過SSH加密的,所以需要一些設置:
第一步:創建SSH key。在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這個兩個文件,如果沒有則進行如下命令:
$ ssh-keygen -t rsa -C "[email protected]"
把郵箱地址換成自己的郵箱地址,一路回車,使用默認值即可,由於這個key不用什麼大用處,所以不需要設置密碼,個人喜好。
表示生成的SSH key成功。id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以告訴別人。
第二步:登錄github,打開”Account settings“ "SSH Keys"頁面,然後點”Add SSH Key“ 填上任意title,在key的文本框粘貼”id_rsa.pub“文件的內容:
點”Add key“,就可以看到已將添加的key。
注意:爲什麼github需要SSH Key呢?因爲github需要識別出你推送的提交確實是你推送的,而不是被人推送的,而git支持SSH協議,所以github只要知道了你的公鑰,就可以確認只有你纔可以推送。當然github允許添加多個key。如果你在本地電腦操作,又在公司電腦操作,只要把每臺點腦的key都添加到github,這樣就可以在每臺電腦上往github推送了。
現在的情景是,你已經在本地創建了一個Git倉庫後,又想在GitHub創建一個Git倉庫,並且讓這兩個倉庫進行遠程同步,這樣,GitHub上的倉庫既可以作爲備份,又可以讓其他人通過該倉庫來協作,真是一舉多得。
首先,登陸GitHub,然後,在右上角找到“Create a new repo”按鈕,創建一個新的倉庫:
目前在github上的這個”learngit“倉庫是空的,github告訴我們,可以從這個倉庫克隆出新的倉庫,也可以把一個已有的本地倉庫與之關聯,然後把本地倉庫的內容推送到github倉庫。
現在,我們根據github的提示,在本地的”learngit“倉庫下運行命令:
$ git remote add origin [email protected]:love-sang/learngit.git
請千萬注意,把上面的love-sang
替換成你自己的GitHub賬戶名。添加後,遠程庫的名字就是origin
,這是Git默認的叫法也可以改成別的,但是origin
這個名字一看就知道是遠程庫。下一步,就可以把本地庫的所有內容推送到遠程庫上:
$ git push -u origin master
把本地庫的內容推送到遠程,用git push
命令,實際上是把當前分支master
推送到遠程。
由於遠程庫是空的,我們第一次推送master
分支時,加上了-u
參數,Git不但會把本地的master
分支內容推送的遠程新的master
分支,還會把本地的master
分支和遠程的master
分支關聯起來,在以後的推送或者拉取時就可以簡化命令。
推送成功後,可以立刻在GitHub頁面中看到遠程庫的內容已經和本地一模一樣,如下截圖表示上傳成功。
從現在起,只要本地作了提交,就可以通過命令:
$ git push origin master
把本地master
分支的最新修改推送至GitHub,現在,你就擁有了真正的分佈式版本庫!
注意:SSH警告
當你第一次使用Git的clone
或者push
命令連接GitHub時,會得到一個警告:
這是因爲Git使用SSH連接,而SSH連接在第一次驗證GitHub服務器的Key時,需要你確認GitHub的Key的指紋信息是否真的來自GitHub的服務器,輸入yes
回車即可。
Git會輸出一個警告,告訴你已經把GitHub的Key添加到本機的一個信任列表裏了:
總結:要關聯一個遠程庫,使用命令git remote add origin git@server-name:path/repo-name.git
;
關聯後,使用命令git push -u origin master
第一次推送master分支的所有內容;
此後,每次本地提交後,只要有必要,就可以使用命令git push origin master
推送最新修改;
分佈式版本系統的最大好處之一是在本地工作完全不需要考慮遠程庫的存在,也就是有沒有聯網都可以正常工作,而SVN在沒有聯網的時候是拒絕幹活的!當有網絡的時候,再把本地提交推送一下就完成了同步,真是太方便了!
你也許還注意到,GitHub給出的地址不止一個,還可以用https://github.com/love-sang/learngit.git
這樣的地址。實際上,Git支持多種協議,默認的git://
使用ssh,但也可以使用https
等其他協議。
使用https
除了速度慢以外,還有個最大的麻煩是每次推送都必須輸入口令,但是在某些只開放http端口的公司內部就無法使用ssh
協議而只能用https
。但通過ssh
支持的原生git
協議速度最快。
注意:本地創建的庫如”learngit“ 而github上創建的庫”learngit“必須同名,否則會找不到對應的庫。
當然你也可以在github上創建一個倉庫然後克隆到本地。如下操作:
$ git clone [email protected]:xxx/xxx.git
七:創建與合併分支
我們知道每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,只有一條時間線,在Git裏,這個分支叫主分支,即
master
分支。HEAD
嚴格來說不是指向提交,而是指向master
,master
纔是指向提交的,所以,HEAD
指向的就是當前分支。
一開始的時候,master
分支是一條線,Git用master
指向最新的提交,再用HEAD
指向master
,就能確定當前分支,以及當前分支的提交點:
每次提交,master
分支都會向前移動一步,這樣,隨着你不斷提交,master
分支的線也越來越長:
當我們創建新的分支,例如dev
時,Git新建了一個指針叫dev
,指向master
相同的提交,再把HEAD
指向dev
,就表示當前分支在dev
上:
你看,Git創建一個分支很快,因爲除了增加一個dev
指針,改改HEAD
的指向,工作區的文件都沒有任何變化!
不過,從現在開始,對工作區的修改和提交就是針對dev
分支了,比如新提交一次後,dev
指針往前移動一步,而master
指針不變:
假如我們在dev
上的工作完成了,就可以把dev
合併到master
上。Git怎麼合併呢?最簡單的方法,就是直接把master
指向dev
的當前提交,就完成了合併:
所以Git合併分支也很快!就改改指針,工作區內容也不變!
合併完分支後,甚至可以刪除dev
分支。刪除dev
分支就是把dev
指針給刪掉,刪掉後,我們就剩下了一條master
分支:
首先,創建dev分支,然後切換到dev分支:
$ git checkout -b dev
git checkout 命令上加”-b“參數表示創建並切換,相當於以下兩條命令:
$ git branch dev --創建分支
$ git checkout dev --切換分支
然後用git branch命令查看當前分支:
$ git branch
git branch 命令會列出所有分支,當前分支前面會標一個”*“號。
現在我們可以在”dev“分支上正常提交。如對learngit.txt做個修改:
Creating a new branch is quick.
然後提交:
$git add learngit.git
$ git commit -m "branch test"
現在由dev分支切換到master分支上
$ git checkout master
切換master分支後,再查看下learngit.txt文件,剛纔添加的內容不見了,因爲那個提交在dev分支上,而master分支此刻的提交點並沒有變:
現在我們把dev分支的工作合併到master分支上:
$ git merge dev
git merge命令用於合併指定分支到當前分支,合併後,再查看learngit.txt內容。就可以看到和dev分支的最新提交時完全一樣的。
注意到上面的”Fast -forward“信息,git告訴我們,這次合併是”快進模式“,也就是直接把master指向dev當前提交,所以合併速度非常快。
合併完成後,可以放心刪除dev分支了。
$ git branch -d dev
刪除後,查看branch就只剩下master分支了:
$ git branch
因爲創建,合併和刪除分支非常快,所以git鼓勵我們使用分支完成某個任務,合併後刪除分支,這跟在master上工作一樣,但是更安全。
在日常開發中我們提交代碼會經常遇到多個人同時修改一個文件,遇到衝突,那麼如何解決衝突呢?
首先我們創建並切換到衝突分支feature1
$ git checkout -b feature1
修改learngit.txt最後一行,改爲:
Creating a new branch is quick and simple.
在feature1分支上提交:
$ git add learngit.txt
$ git commit -m "and simple."
切換主分支master
$ git checkout master
在master分支上把learngit.txt的最後一行修改爲:
Creating a new branch is quick & simple.
提交:
$ git add learngit.txt
$ git commit -m "& simple."
現在master分支和feature1分支各自都分別有新的提交,變成這樣:
這種情況下,git無法執行”快速合併“,只能把各自的修改合併起來,故這種合併就可能會有衝突:
$ git merge feature1
git告訴我們,learngit.txt文件存在衝突,必須手動解決衝突再提交,git status可以查看衝突文件:
$ git status
查看learngit.txt的內容,知道衝突地方:
git用<<<<<,========,>>>>>>>標記處不同分支的內容,我們修改如下內容後保存:
Creating a new branch is quick and simple.
現在master分支和feature1分支變成了如下截圖:
手動修改衝突文件learngit.txt然後提交,然後合併分支,最後刪除feature1分支:
$ git merge feature1
$ git branch -d feature1
通常合併分支時Git默認使用Fast forward
模式,但這種模式下,刪除分支後會丟掉分支信息。如果要強制禁用Fast forward
模式,Git就會在merge時生成一個新commit,這樣,從分支歷史上就可以看出分支信息。
"--no-ff
"參數可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而fast
forward
合併就看不出來曾經做過合併。
$ git merge --no-ff -m "merge with no-ff" feature1
"-m"
參數,把commit描述寫進去。
$ git log --graph
可以查看到分支具體情況。
有時在開發過程中你創建了一個分支feature-vulcan,但是沒有和master分支合併,而你就想刪除feature-vulcan分支:
刪除失敗,git告訴你,feature-vulcan分支還沒有被合併,如果刪除,將丟失掉修改,如果強制性刪除,用命令:git branch -D feature1
$ git branch -D feature1
git branch -D <name>表示:丟棄一個沒有被合併過的分支,強行刪除。
八:多人協作開發
在日常開發中,bug就像家常便飯一樣。有了bug就需要修復,在Git中,由於分支是如此的強大,所以,每個bug都可以通過一個新的臨時分支來修復,修復後,合併分支,然後將臨時分支刪除。
首先我們把正在工作的dev分支“儲存起來”:
$ git stash
git stash 命令就是把當前修改還未commit先”儲存起來“.
修改bug,首先要確定在哪個分支上修改bug,然後切換到該分支上,然後創建bug分支,如在master分支上修改bug:
$ git checkout master
$ git checkout -b issue-101
修改bug完成後提交(隨便在learngit.txt上寫點什麼)
$ git add learngit.txt
$ git commit -m "fix bug 101"
修改完成後,切換到master分支,併合並分支,最後刪除bug分支
$ git checkout master
$ git merge --no-ff -m "merge bug fix 101" issue-101
$ git branch -d issue-101
到處我們修改完bug並提交,之前我們把正在工作的dev分支還原:
切換到dev分支
$ git checkout dev
$ git status
用git stash list查看被“儲存起來”的dev分支
$ git stash list
恢復dev分支有2中方法:一種是git stash apply 但是恢復後stash內容並不刪除,需要用 git stash drop來刪除;另一種是git stash pop恢復的同時也把stash內容刪除:
git stash pop
再用git stash list 查看,stash沒有任何內容。
在日常開發中我們需要把遠程github倉庫下載到本地進行開發,故我們需要克隆遠程倉庫,實際上git自動把本地的master分支和遠程的分支對應起來,並且遠程倉庫的默認名稱是origin
查看遠程倉庫用 git remote
$ git remote
用git remote -v顯示詳細信息
$ git remote -v
把本地所有提交到遠程倉庫,提交要指定本地分支,這樣git就會把該分支推送到遠程倉庫對應分支上:
$ git push origin master
若是推送其他分支如dev分支則:
$ git push origin dev
注意:推送分支不是什麼都推送有些不需要。首先master分支是主分支,本地和遠程時刻保持同步。其次dev分支是開發分支,所有人都在上面開發,所以也要時刻保持同步,再次bug分支只用於本地修改bug,就不需要推送到遠程,最後其他自己測試分支feature也不需要推送到遠程。
克隆遠程倉庫:
git clone [email protected]:love-sang/learngit.git
注意默認情況下遠程clone是master分支。
日常開發中我們不在master上工作,都是創建dev分支進行協作開發然後推動到遠程倉庫中:
首先創建遠程origin的dev分支到本地:
$ git checkout -b dev origin/dev
然後修改dev分支上的內容,再把dev分支push到遠程(learngit.txt上隨便寫點什麼)
$ git add learngit.txt
$ git commit -m "write learngit file"
$ git push origin dev
若是在推送過程中發生衝突,則我們先git pull 把最新的提交從origin/dev上抓下來,然後在本地合併解決衝突再推送:
$ git pull
這是發現git pull也失敗是因爲沒有指定本地dev分支與遠程origin/dev分支的鏈接,則先設置本地和遠程dev鏈接:
git branch --set-upstream dev origin/dev
然後再git pull
$ git pull
注意:在遠程git pull 的dev分支時出現“no tracking information”則說明本地分支和遠程分支的鏈接沒有倉庫,
用命令:git branch --set-upstream branch-name origin/branch-name