?Git操作
一、創(chuàng)建git倉庫
git init --bare fasloan.git
授權(quán)限
chown -R git:git fasloan.git ????
遠程庫克隆
git clone git@X.X.X.X:/home/yd_fasloan/fasloan.git
二、創(chuàng)建與合并分支
(分支管理:你創(chuàng)建了一個屬于你自己的分支,別人看不到,還繼續(xù)在原來的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到開發(fā)完畢后,再一次性合并到原來的分支上,這樣,既安全,又不影響別人工作。其他版本控制系統(tǒng)如SVN等都有分支管理,但是用過之后你會發(fā)現(xiàn),這些版本控制系統(tǒng)創(chuàng)建和切換分支比蝸牛還慢,簡直讓人無法忍受,結(jié)果分支功能成了擺設(shè),大家都不去用。但Git的分支是與眾不同的,無論創(chuàng)建、切換和刪除分支,Git在1秒鐘之內(nèi)就能完成!無論你的版本庫是1個文件還是1萬個文件。)
1.創(chuàng)建dev分支,然后切換到dev分支:
$ git checkout -b dev

git checkout命令加上-b參數(shù)表示創(chuàng)建并切換,相當于以下兩條命令:
$ git branch dev
$ git checkout dev
Switchedto branch'dev'
2.?用git branch命令查看當前分支:
$ git branch? ? ? ? ? ? ? ? ? ?
* dev? ? ? ? ? ? ? ?
master
git branch命令會列出所有分支,當前分支前面會標一個*號。

在dev分支上正常提交,比如對fasloan_view.py 做個修改,刪除一行:print111然后提交:
3. 先查看當前狀態(tài):

表示修改了fasloan_view.py的文件內(nèi)容,現(xiàn)在提交一下將文件加入暫存區(qū):

對剛提交的文件進行描述,實際上是把暫存區(qū)的所有內(nèi)容提交到當前分支:

簡單解釋一下git commit命令,-m后面輸入的是本次提交的說明,可以輸入任意內(nèi)容,當然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動記錄。查看現(xiàn)在的狀態(tài),該工作區(qū)是干凈的沒有任務(wù)去提交:

現(xiàn)在,dev分支的工作完成,我們就可以切換回master分支:

查看fasloan_view.py文件,發(fā)現(xiàn)剛才刪除那行仍然存在:
1.查看fasloan_view.py文件

2.內(nèi)容未修改:

解決辦法:
因為那個提交實在dev分支上,而master分支此刻提交點并沒有變。我們把dev分支上的工作修改合并到master分支上:

git merge命令用于合并指定分支到當前分支。合并后,再查看fasloan_view.py的內(nèi)容,就可以看到,和dev分支的最新提交是完全一樣的。

現(xiàn)在將所有改動都合并到主分支了,用git log看看分支歷史:

在實際開發(fā)中,我們應(yīng)該按照幾個基本原則進行分支管理:
(首先,master分支應(yīng)該是非常穩(wěn)定的,也就是僅用來發(fā)布新版本,平時不能在上面干活;
那在哪干活呢?干活都在dev 分支上,也就是說,dev 分支是不穩(wěn)定的,到某個時候,比如1.0版本發(fā)布時,再把dev分支合并到master上,在master分支發(fā)布1.0版本;你和你的小伙伴們每個人都在dev分支上干活,每個人都有自己的分支,時不時地往dev分支上合并就可以了。)
合并分支時,加上--no-ff參數(shù)就可以用普通模式合并,合并后的歷史有分支,能看出來曾經(jīng)做過合并,而fast forward合并就看不出來曾經(jīng)做過合并。
?因為本次合并要創(chuàng)建一個新的commit,所以加上-m參數(shù),把commit描述寫進去。
$ git merge --no-ff? -m "merge with no-ff " dev
$ git log--graph --pretty=oneline --abbrev-commit
三、查看遠程庫的信息用git remote::

或者,用git remote -v顯示更詳細的信息:

上面顯示了可以抓取和推送的origin的地址。如果沒有推送權(quán)限,就看不到push的地址。
四、推送分支
1.推送分支,就是把該分支上的所有本地提交推送到遠程庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應(yīng)的遠程分支上

并不是一定要把本地分支往遠程推送
master分支是主分支,因此要時刻與遠程同步;
dev分支是開發(fā)分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步;
2. 多人協(xié)作工作模式:
(1)使用git push origin ?<分支名> 推送自己的修改
(2)如果推送失敗,則因為遠程分支比你的本地更新,需要先用git pull試圖合并
(3)]如果和并有沖突,則解決沖突,并在本地提交
(4)沒有沖突或者解決掉沖突后,再用git push origin <分支名>就能推送成功
如果git pull提示no tracking information, 則說明本地分支和遠程分支的鏈接關(guān)系沒有創(chuàng)建,用命令git branch --set-upstream-to <分支名> origin/<分支名>
五、解決沖突:
新分支開發(fā)feature1:

修改fasloan_view.py,添加了一行print(11)

提交:

在master分支上把fasloan_view.py文件修改添加print(1111), 文件已被修改:

添加文件到暫存區(qū)并提交:


這種情況git無法執(zhí)行快速合并,只能試圖把各自的修改合并起來,但這種合并可能會有沖突:

Git告訴我們,fasloan_view.py文件存在沖突,必須手動解決沖突后再提交。git status也可以告訴我們沖突的文件:

修改內(nèi)容之后保存,再提交:

刪除feature1分支:

最后推到遠程:

六、版本回退
Git每當文件修改到一定程度的時候,就可以“保存”一個快照,這個快照在Git里被稱為commit,一旦把文件改亂了,或者誤刪了文件,還可以從最近的一個commit恢復(fù),繼續(xù)工作。
git log命令顯示從最近到最遠的提交日志,如果嫌輸出信息太多,看得眼花繚亂的,可以試試加上--pretty=oneline參數(shù):

看到一大串類似7feo2的是commit id(版本號), 一個通過SHA1計算出來的非常大的數(shù)字,用十六進制表示。
回到上個版本,首先Git要知道當前版本是哪個,在Git中,用HEAD表示當前版本,也就是最新。上個版本HEAD^,上上個版本時HEAD^^, 當然網(wǎng)上100個版本,寫成HEAD~100.
回退上一個版本:

已被還原:

若想再回去,只要命令行窗口還沒有被關(guān)掉,可以順著找commit id,于是就可以回到未來的某個版本,版本號沒必要寫全,前幾位就可以了,Git會自動去找。當然也不能只寫前一兩位,因為Git可能會找到多個版本號,就無法確定是哪一個了:

你回退到了某個版本,關(guān)掉了電腦,第二天早上就后悔了,想恢復(fù)到新版本,Git提供了一個命令git reflog用來記錄你的每一次命令:

又找回了你想回到指定版本的commit id。
七、撤銷修改:
git checkout -- file可以丟棄工作區(qū)的修改:把文件在工作區(qū)的修改全部撤銷有兩種情況:
(1)文件自修改后還沒有被放到暫存區(qū),現(xiàn)在撤銷修改就回到和版本庫一模一樣的狀態(tài)。
(2)文件已經(jīng)添加到暫存區(qū),又做了修改,現(xiàn)在撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。總之,就是讓文件回到最近一次git commit或者git add時的狀態(tài)。
修改文件并添加到了暫存區(qū),慶幸的是在commit之前,用git status查看,修改到了暫存區(qū),還沒有提交;
用命令git reset HEAD fasloan_view.py可以把暫存區(qū)的修改撤銷掉,重新放回工作區(qū)。假設(shè)不但改錯東西,還從暫存區(qū)提交到了版本庫,就只能回到上一個版本(條件是還沒把本地版本庫推送到遠程)
總結(jié):
(1)當你改亂了工作區(qū)某個文件的內(nèi)容,想直接丟棄工作區(qū)的修改時,用命令git checkout -- file。
(2)當你不但改亂了工作區(qū)某個文件的內(nèi)容,還添加到了暫存區(qū)時,想丟棄修改,分兩步,第一步用命令git reset HEAD ,就回到了場景1,第二步按場景1操作。
(3)已經(jīng)提交了不合適的修改到版本庫時,想要撤銷本次提交,只能回退版本,不過前提是沒有推送到遠程庫。