首先安裝好在windows下的linux模擬交互器
這里我選擇的是cygwin
這里我是參考:http://book.51cto.com/art/201107/278731.htm
這里還要注意我這里用的是內網,況且我用的是域名訪問,所以這里每台使用的電腦都需要在自己的機器上做接下
vim /etc/hosts(這一步在cygwin 安裝之后執行,有了cygwin太方便了,然后你可以使用scp 把公鑰給傳給服務器)
安裝 Cygwin
Cygwin 的安裝非常簡單,先在其官方網站 http://www.cygwin.com/下載安裝程序—一個只有幾百KB的setup.exe文件,然后即可開始安裝。
安裝過程中會讓用戶選擇安裝模式:通過網絡安裝、下載后安裝或者通過本地軟件包緩存(安裝時自動在本地目錄下建立的軟件包緩存)安裝。
在安裝的時候,把需要的安裝包盡量都給他按了,我記得的是我裝了有git,openssh,vim上面有一個搜索框,輸入git,在Devel 下面有,把哪些
對應的skip 的給他去掉。
安裝完成之后我們需要給其配置公鑰
比如說: ssh-keygen -t rsa -C "admin@example.com"
然后拷貝公鑰到gitlab 服務器上,在gitlab服務器上,選擇“個人資料設置”———》“SSH密鑰”————》“把剛剛產生的id.rsa.pub拷貝到上面”
然后再本地創建一個目錄作為自己的“本地版本庫”,把自己的本地版本庫和遠程服務器的版本庫關聯起來
git init
git remote add origin git@192.168.220.99:root/fortune.git
還有就是我之前在測試的時候遇到很多錯誤,到最后的時候git push 的時候還是報錯
$ git push origin master
To git@git.yizhen.com:root/fortune.git
! [rejected] master -> master (non-fast-forward)
error: 無法推送一些引用到 'git@git.yizhen.com:root/fortune.git'
提示:更新被拒絕,因為您當前分支的最新提交落后於其對應的遠程分支。
提示:再次推送前,先與遠程變更合並(如 'git pull ...')。詳見
提示:'git push --help' 中的 'Note about fast-forwards' 小節。
這時候需要執行
git pull origin master
(這時候會出來一個問你合並的理由,你自己看着寫)
#git pull origin master master
然后再git push 就好了
現在我們來說一下git的分支(這里是完全按照http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840038939c291467cc7c747b1810aab2fb8863508000做的筆記)
一般我們默認的情況下,我們當前的分支都是master
1.現在我們來創建一下分支
git checkout -b dev
這個意思就是說我們創建一個dev分支,並且由當前的master分支切換到dev分支上(這里加上"-b"這個參數了,這里如果我們想只創建dev這個分支,但是並不想切換過去,執行 git branch dev就行了),現在我們可以查看一下當前的分支是哪個
git branch
我們會看到當前的分支是指向在dev分支上的(分支前面有一個“*”號,同時分支名也是高亮顯示的)
這時候如果我們進行提交的話,狀態就會變成下面這個樣子
意思也就是說我現在所有的代碼都是在dev分支上面執行的,我們之前的額master分支上面的內容沒有變(意思就是說,我現在在分支dev分支上的所有操作,其他人是看不見的,這個只是屬於我的,除非我和master分支合並。)
說到這,所以這里我們就是要合並了,合並完成之后,刪除dev分支。然后狀態就會變成下面這個樣子了
具體方法:
舉例說:
我們現在 git checkout -b dev
然后我們在 dev 分支上創建一個readme文件,文件內容為“hello dev”
但是這里我們需要提交
git add readme
git commit -m "add readme"
如果不執行這兩句,當我們切換到別的分支的時候,我們是可以看見當前目錄下面的內容的,但是如果我們執行的話,我們切換到別的分支的后,是看不見剛剛創建的文件的
這時候我么切換到master分支上 git checkout master
然后我們合並一下dd分支,
git merge dd
這樣我們就能看到剛剛在dd分支上創建的文件了
這時候我們執行git branch -d dd 刪除dd這個分支
總結一下 分支命令:
查看分支:git branch
創建分支:git branch <name>
切換分支:git checkout <name>
創建+切換分支:git checkout -b <name>
合並某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
現在我么來說一下解決git的沖突問題
比方說我們現在有兩個分支dev分支和master分支
git checkout dev
vim readme
內容為“111111111”
然后:
git add readme
git commit -m "check readme 11111"
然后再切換到master分支上
git checkout master
vim readme
內容為“2222222222222”
然后:
git add readme
git commit -m "checkout readme 22222"
也就是說我們現在在兩個分支上都對readme 文件做了修改,而且修改的內容不同,這時候我們進行合並
git merge dev
這時候會報錯
自動合並readme
沖突(內容): 合並沖突於readme ,合並失敗,需要進行手動修改之后再提交才行
這時候我們執行git status
會提示 雙方修改了readme文件
這時候我們 vim readme
打開后會顯示出
<<<<<<< HEAD 111111111 ======= 2222222222222 >>>>>>> dev
會顯示出來兩個分支到底哪里不同,然后根據你的需要進行修改就好了
然后我們執行
git add readme
git commit -m "Bingo"
這里我們可以使用下面這個命令查看分支的合並情況
git log --graph --pretty=oneline --abbrev-commit
這時候我們可以刪除dev分支了
使用git log --graph 可以查看整個的合並分支的詳細情況
現在來說一下分支的管理策略:
在我們工作的時候,一般合並分支,git 通常會使用Fast forward的模式,但是在這種模式情況下,在我們刪除分支后,會丟失分支的信息
所以這樣我們使用 git merge --no-ff -m "add XXXXX" dev 來合並分支,git在merge的時候會創建一個新的commit,這樣在分支的歷史上就可以看出分支的信息
語法和 git merge dev 一樣
這里我們這樣
vim readme
git add readme
git commit -m "check readme"
git checkout master
git merge --no-ff -m "merge --no-ff" dev
這里說一下,我們在平常的開發過程中的分支策略:
在這里的master分支是非常穩定的,所以這里我們只用來新版本的發布,平時不在上面干活。
我們平時在 dev分支上干活,所有的小伙伴都有自己的分支,然后小伙伴每次往dev分支上合並就行了。所以平時的工作情況就是這樣的
下面要說的是BUG分支:
在我們的日常開發工作中是會經常遇到BUG的,這個時候git的作用就大了。比如說這時候有一個BUG,但是你現在正在你自己的分支上干活,這時候要求你去修復BUG,但是你手頭的工作沒有做完,這個時候你又不能commit提交,所以這個時候git提供了一個新功能就是,保存你現在的工作現場(凍結工作現場,保證你可以永遠年輕啊,哈哈哈哈哈)
這時候我們執行
git stash (凍結現場)
現在我們去修復BUG,大膽一點,直接在master分支上修改,修改完成之后
git add
git commit
現在我們再checkout到dev分支上,繼續自己的工作。
這個時候我們執行git status查看一下狀態,發現是干凈的,因為現場被凍結了。
我們使用 git stash list 可以看見git把我的工作現場給保存在一個黑暗的小角落里了
我們去拯救他把,恢復工作現場,有兩種方法
(1)git stash apply,然后執行 git stash drop來刪除stash 的內容
(2)git stash pop(一般我們選擇這個方式)
這個時候我們用git status 就會看到你想看的了
現在我們在遠程倉庫添加一個dev分支
然后再本地也添加一個dev分支
在本地的dev分支上創建文件,然后就開始
git add
git commit
我在執行git push origin dev 的時候報錯,
無法推送一些引用到 'git@git.yizhen.com:root/esbtest.git'
提示:更新被拒絕,因為遠程倉庫包含您本地尚不存在的提交。這通常是因為另外
提示:一個倉庫已向該引用進行了推送。再次推送前,您可能需要先整合遠程變更
提示:(如 'git pull ...')。
讓我執行git pull origin dev
然后再執行git push origin dev 就行了
但是正常的情況下都是可以的(應該是我前面那個地方做錯了)
下面說一下多人協作:
下面內容摘自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013760174128707b935b0be6fc4fc6ace66c4f15618f8d000
和前面一樣,每個人都從遠程的dev分支上clone 一個倉庫到自己的電腦本地,完工后在push到遠程的分支
其實在我們clone 遠程分支的時候,我們的dev分支已經和遠程的dev分支關聯起來了。git remote add
我們可以使用 git remote -v 查看遠程倉庫額詳細信息
如果你沒有push 的權限的話,你是看不到push 的地址的。
但是,並不是一定要把本地分支往遠程推送,那么,哪些分支需要推送,哪些不需要呢?
-
master
分支是主分支,因此要時刻與遠程同步; -
dev
分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步; -
bug分支只用於在本地修復bug,就沒必要推到遠程了,除非老板要看看你每周到底修復了幾個bug;
-
feature分支是否推到遠程,取決於你是否和你的小伙伴合作在上面開發。
總之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,視你的心情而定!
抓取分支:
現在比如說遇到一個情況就是現在有兩個人都對dev分支上的文件進行了修改,研發A已經把本地的dev分支上的內容推送到遠程倉庫了。好了,現在你也要推送你修改的文件到遠程的dev分支上,但是你的提交和你小伙伴的提交有沖突,這個時候他會提示你,把他的最新提交給pull 下來,就是我們前面遇到的問題
Git已經提示我們,先用git pull
把最新的提交從origin/dev
抓下來,然后,在本地合並,解決沖突,再推送:
git pull
也失敗了,原因是沒有指定本地dev
分支與遠程origin/dev
分支的鏈接,根據提示,設置dev
和origin/dev
的鏈接:
$ git branch --set-upstream dev origin/dev
再次執行 pull
git pull
git pull 成功,但是我們合並的時候會報錯,這個時候就需要手動去解決你的沖突了。可能是你們兩個人修改了同一個文件,但是修改的內容不一樣,這時候你們兩個就要商量一下了,到底誰是對的,修改沖突的地方,修改完成之后
就
git commit -m "XXXXXXXX"
git push
多人協作的工作模式通常是這樣:
-
首先,可以試圖用
git push origin branch-name
推送自己的修改; -
如果推送失敗,則因為遠程分支比你的本地更新,需要先用
git pull
試圖合並; -
如果合並有沖突,則解決沖突,並在本地提交;
-
沒有沖突或者解決掉沖突后,再用
git push origin branch-name
推送就能成功!
如果git pull
提示“no tracking information”,則說明本地分支和遠程分支的鏈接關系沒有創建,用命令git branch --set-upstream branch-name origin/branch-name
。
這就是多人協作的工作模式,一旦熟悉了,就非常簡單。
小結
-
查看遠程庫信息,使用
git remote -v
; -
本地新建的分支如果不推送到遠程,對其他人就是不可見的;
-
從本地推送分支,使用
git push origin branch-name
,如果推送失敗,先用git pull
抓取遠程的新提交; -
在本地創建和遠程分支對應的分支,使用
git checkout -b branch-name origin/branch-name
,本地和遠程分支的名稱最好一致; -
建立本地分支和遠程分支的關聯,使用
git branch --set-upstream branch-name origin/branch-name
; -
從遠程抓取分支,使用
git pull
,如果有沖突,要先處理沖突。
下面說一下標簽管理:
這里的標簽的意思就是:
Git的標簽雖然是版本庫的快照,但其實它就是指向某個commit的指針(跟分支很像對不對?但是分支可以移動,標簽不能移動),所以,創建和刪除標簽都是瞬間完成的。
標簽的意思是:
“我要找commit id是892b892a3f7...的那個版本”
“一串亂七八糟的數字怎么找?”
“我要找的commit id是打了標簽(tag) “v1.1”的那個版本”
“找到了:git show v1.1”
下面說一下創建標簽:
直接執行git tag v1.2
然后執行git tag 查看當前有哪些標簽
當然我們還可以給歷史的commit 打上標簽
首先我們使用
git log --pretty=oneline --abbrev-commit
查看到歷史的commit id然后使用git tag v3.4
6224937
(這個是id號)這里的標簽不是按照時間順序排的,而是按照字母順序排的。可以使用 git show <tagname>查看標簽的詳細信息
創建帶有說明的標簽
git tag -a v3.5 -m "XXXXXX" commit_id
如果標簽打錯了,可以刪除
git tag -d <tagname>
推送某個標簽到遠程
git push origin v3.4
git push origin --tags 推送所有的標簽
若果要刪除遠程的標簽就:
先刪除本機的標簽
然后刪除遠程的
git push origin :refs/tags/v3.4
下面說一下git的一些小技巧
比如說有的命令比較難記,這時候我們可以給他起一個別名
git config -- global alias.st status
上面的git st 就是代表git status 了