git學習筆記

來源:互聯網
上載者:User

標籤:

Git的官方網站:http://git-scm.com

安裝:
msysgit是Windows版的Git,從http://msysgit.github.io/下載,然後按預設選項安裝即可。安裝完成後,在開始菜單裡找到“Git”->“Git Bash”,蹦出一個類似命令列視窗的東西,就說明Git安裝
成功!安裝完成後,還需要最後一步設定,在命令列輸入:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
git config命令的--global參數,用了這個參數,表示你這台機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的使用者名稱和Email地址。
$ git config --global color.ui true #可以配置讓Git顯示顏色

建立版本庫:
git init

把檔案添加到版本庫:(提交修改和提交新檔案是一樣的)
git add readme.txt
git commit -m "wrote a readme file"
例子:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

查看檔案修改:
如果git status告訴你有檔案被修改過,用git diff可以查看修改內容。
git status:命令可以讓我們時刻掌握倉庫當前的狀態
git diff:顧名思義就是查看difference,顯示的格式正是Unix通用的diff格式。
$git diff HEAD -- readme.txt #交後,查看工作區和版本庫裡面最新版本的區別

版本回退:
穿梭前,用git log可以查看提交曆史,以便確定要回退到哪個版本:
$ git log #一大串類似3628164...882e1e0的是commit id(版本號碼)
$ git log --pretty=oneline #看得眼花繚亂的可以加上--pretty=oneline參數
$ git reset --hard HEAD^ #回退到上一個版本,HEAD表示目前的版本,上一個版本是HEAD^,上上一個版本HEAD^^,往上100個版本HEAD~100
現在,你回退到了某個版本,關掉了電腦,第二天早上就後悔了,想恢複到新版本怎麼辦?
要重返未來,用git reflog查看命令曆史,以便確定要回到未來的哪個版本:
$ git reflog
$ git reset --hard 3628164 #版本號碼沒必要寫全,前幾位就可以了,Git會自動去找。當然如果Git找到多個版本號碼,就無法確定是哪一個了

撤銷修改:
$ git checkout -- readme.txt #只能撤銷工作區的修改
命令git checkout -- readme.txt意思就是,把readme.txt檔案在工作區的修改全部撤銷,這裡有兩種情況:
一種是readme.txt自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
一種是readme.txt已經添加到暫存區後,又作了修改,現在,撤銷修改就回到添加到暫存區後的狀態。
總之,就是讓這個檔案回到最近一次git commit或git add後的狀態。

$ git reset HEAD readme.txt #撤銷暫存區
用命令git reset HEAD file可以把暫存區的修改撤銷掉(unstage),重新放回工作區。git reset命令既可以回退版本,也可以把暫存區的修改回退到工作區。當我們用HEAD時,表示最新的版本。

回退情境:
情境1:當你改亂了工作區某個檔案的內容,想直接丟棄工作區的修改時,用命令git checkout -- file。
情境2:當你不但改亂了工作區某個檔案的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了情境1,第二步按情境1操作。
情境3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。

刪除檔案:
直接在檔案管理工具中把沒用的檔案刪了,或者用rm命令刪了
選擇1:確認刪除
$ git rm test.txt
$ git commit -m "remove test.txt"
選擇2:刪錯了,把誤刪的檔案恢複到最新版本
$ git checkout -- test.txt

 

使用git遠程倉庫GitHub:
1、設定SSH:
第1步:建立SSH Key。在使用者主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個檔案,如果已經有了,可直接跳到下一步。如果沒有,開啟Shell(Windows
下開啟Git Bash),建立SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"
如果一切順利的話,可以在使用者主目錄裡找到.ssh目錄,裡面有id_rsa和id_rsa.pub兩個檔案,這兩個就是SSH Key的秘鑰對,id_rsa是私密金鑰,不能泄露出去,id_rsa.pub是公開金鑰,可以放心地告訴任何人 。

第2步:登陸GitHub,開啟“Account settings”,“SSH Keys”頁面:然後,點“Add SSH Key”,填上任意Title,在Key文字框裡粘貼id_rsa.pub,點“Add Key”,你就應該看到已經添加的Key檔案的內容

說明:
GitHub允許你添加多個Key。假定你有若干電腦,你一會兒在公司提交,一會兒在家裡提交,只要把每台電腦的Key都添加到GitHub,就可以在每台電腦上往GitHub推送了。
如果你不想讓別人看到Git庫,有兩個辦法,一個是交點保護費,讓GitHub把公開的倉庫變成私人的,這樣別人就看不見了(不可讀更不可寫)。另一個辦法是自己動手,搭一個Git伺服器,因為是你自
己的Git伺服器,所以別人也是看不見的。這個方法我們後面會講到的,相當簡單,公司內部開發必備。

2、(本地庫)添加到遠程庫
你已經在本地建立了一個Git倉庫後,又想在GitHub建立一個Git倉庫,並且讓這兩個倉庫進行遠程同步。
第1步:登陸GitHub,然後,在右上方找到“Create a new repo”按鈕,建立一個新的倉庫,在Repository name填入learngit,其他保持預設設定,點擊“Create repository”按鈕,就成功地建立了
一個新的Git倉庫

第2步:在本地的learngit倉庫下運行命令git remote add origin [email protected]:path/repo-name.git(關聯一個遠程庫):
$ git remote add origin [email protected]:michaelliao/learngit.git #遠程庫的名字就是origin。

第3步:把本地庫的所有內容推送到遠程庫上
$ git push -u origin master #推送成功後,可以立刻在GitHub頁面中看到遠程庫的內容已經和本地一模一樣
由於遠程庫是空的,我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠端master分支關聯起來,在以後的推
送或者拉取時就可以簡化命令

此後:每次本地提交後,只要有必要,就可以使用命令git push origin master推送最新修改

3、從遠程庫複製(到本地)
要複製一個倉庫,首先必須知道倉庫的地址,然後使用git clone命令複製。Git支援多種協議包括https,但通過ssh支援的原生git協議速度最快。
第1步:首先,登陸GitHub,建立一個新的倉庫,名字叫gitskills,勾選Initialize this repository with a README
第2步:在本地執行$ git clone [email protected]:michaelliao/gitskills.git


建立與合并分支:
$ git checkout -b dev #git checkout -b <name> 建立dev分支,然後切換到dev分支
相當於:
$ git branch dev #git branch <name>
$ git checkout dev #git checkout <name>

$ git branch #列出所有分支,當前分支前面會標一個*號

$ git checkout master #切換回master分支

$ git merge dev #git merge <name> 合并指定分支到當前分支。此刻即把dev分支的工作成果合并到master分支上,Fast-forward表示快速合并

$ git branch -d dev #git branch -d <name> 合并完成後就可以放心地刪除dev分支

因為建立、合并和刪除分支非常快,所以Git鼓勵你使用分支完成某個任務,合并後再刪掉分支,這和直接在master分支上工作效果是一樣的,但過程更安全


解決衝突:
當Git無法自動合并分支時,就必須首先解決(手工)衝突。解決衝突後,再提交,合并完成。
用git log --graph命令可以看到分支合并圖:$ git log --graph --pretty=oneline --abbrev-commit
詳見視頻:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840202368c74be33fbd884e71b570f2cc3c0d1dcf000

 

分支管理原則:
通常,合并分支時,如果可能(無衝突發生),Git會用Fast forward快速合并模式,但這種模式下,刪除分支後,會丟掉分支資訊。如果要強制禁用Fast forward模式,Git就會在merge時產生一個新的
commit,這樣,從分支曆史上就可以看出分支資訊
$ git merge --no-ff -m "merge with no-ff" dev #--no-ff參數,表示禁用Fast forward
$ git log --graph --pretty=oneline --abbrev-commit #能看到分支曆史
在實際開發中,我們應該按照幾個基本原則進行分支管理:
首先,master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面幹活;
幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發布時,再把dev分支合并到master上,在master分支發布1.0版本;你和你的小夥伴們每個人都在dev分支上幹活,每個
人都有自己的分支,時不時地往dev分支上合并就可以了。


BUG分支:
每個bug都可以通過一個新的臨時分支來修複,修複後,合并分支,然後將臨時分支刪除。
當你接到一個修複一個代號101的bug的任務時,很自然地,你想建立一個分支issue-101來修複它,但是,等等,當前正在dev上進行的工作還沒有提交,怎麼辦?
1、儲存工作現場
$ git stash #Git還提供了一個stash功能,可以把當前工作現場“儲藏”起來,等以後恢複現場後繼續工作
$ git status #現在,用git status查看工作區,就是乾淨的(除非有沒有被Git管理的檔案)

2、確定要在哪個分支上修複bug
假定需要在master分支上修複,就從master建立臨時分支:
$ git checkout master
$ git checkout -b issue-101
修改BUG並提交(add和commit)

3、切換到master分支,並完成合併,最後刪除issue-101分支
$ git checkout master
$ git merge --no-ff -m "merged bug fix 101" issue-101
$ git branch -d issue-101

4、回到dev分支幹活
$ git checkout dev
$ git status
工作區是乾淨的,剛才的工作現場存到哪去了?用git stash list命令看看:$ git stash list
$ git stash pop #恢複的同時把stash內容也刪了
相當於:
$ git stash apply #恢複後,stash內容並不刪除
$ git stash drop #刪除stash內容
$ git stash list #再看不到任何stash內容了

$ git stash apply [email protected]{0} #可以多次stash,恢複的時候,先用git stash list查看,然後恢複指定的stash


Feature分支:
軟體開發中,總有無窮無盡的新的功能要不斷添加進來。每添加一個新功能,最好建立一個feature分支,在上面開發,完成後,合并,最後,刪除該feature分支。
一個新任務開發代號為Vulcan的新功能:
$ git checkout -b feature-vulcan
5分鐘後,開發完畢:
$ git add vulcan.py
$ git status
切回dev,準備合并:
$ git checkout dev
此時,接到上級命令,因經費不足,新功能必須取消,雖然白乾了,但是這個分支還是必須就地銷毀:
$ git branch -d feature-vulcan #銷毀失敗
$ git branch -D feature-vulcan #銷毀成功,如果要丟棄一個沒有被合并過的分支,可以通過git branch -D <name>強行刪除

 

多人協作:
當你從遠程倉庫複製時,實際上Git自動把本地的master分支和遠端master分支對應起來了,並且,遠程倉庫的預設名稱是origin。
$ git remote #查看遠程庫的資訊
$ git remote -v #查看遠程庫的資訊,顯示更詳細的資訊。如果沒有推送許可權,就看不到push的地址
$ git push origin master #推送分支,就是把該分支上的所有本地提交推送到遠程庫。推送時,要指定本地分支

哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要時刻與遠程同步;
dev分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步;
bug分支只用於在本地修複bug,就沒必要推到遠程了,除非老闆要看看你每周到底修複了幾個bug;
feature分支是否推到遠程,取決於你是否和你的小夥伴合作在上面開發。

本地建立的分支如果不推送到遠程,對其他人就是不可見的;
在本地建立和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;
從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠端新提交;
建立本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name,否則git pull失敗;
從遠程抓取分支,使用git pull,如果有衝突,要先處理衝突。

 

標籤管理:
發布一個版本時,我們通常先在版本庫中打一個標籤,這樣,就唯一確定了打標籤時刻的版本。將來無論什麼時候,取某個標籤的版本,就是把那個打標籤的時刻的曆史版本取出來。所以,標籤也是版
本庫的一個快照。其實它就是指向某個commit的指標。
$ git checkout master #首先切換到需要打標籤的分支上
$ git tag v1.0 #命令git tag <name>就可以打一個新標籤,預設標籤是打在最新提交的commit上的
$ git tag #查看所有標籤
如果忘了打標籤,比如,現在已經是周五了,但應該在周一打的標籤沒有打,怎麼辦?
找到曆史提交的commit id,然後打上就可以了:
$ git log --pretty=oneline --abbrev-commit
$ git tag v0.9 6224937 #對add merge這次提交打標籤,它對應的commit id是6224937
$ git tag #再查看所有標籤,注意,標籤不是按時間順序列出,而是按字母排序的
$ git show v0.9 #用git show <tagname>查看標籤資訊
$ git tag -a v0.1 -m "version 0.1 released" 3628164 #可以建立帶有說明的標籤,用-a指定標籤名,-m指定解說文字
$ git tag -s v0.2 -m "signed version 0.2 released" fec145a #可以通過-s用私密金鑰簽名一個標籤
$ git tag -d v0.1 #刪除標籤(本地)
$ git push origin v1.0 #推送某個標籤到遠程git push origin <tagname>
$ git push origin --tags #次性推送全部尚未推送到遠端本地標籤
如果標籤已經推送到遠程,要刪除遠程標籤:
$ git tag -d v0.9 #先從本地刪除
$ git push origin :refs/tags/v0.9 #然後從遠程刪除。命令git push origin :refs/tags/<tagname>可以刪除一個遠程標籤


自訂Git:
1、忽略特殊檔案:
有些時候,你必須把某些檔案放到Git工作目錄中,但又不能提交它們,比如儲存了資料庫密碼的設定檔啦,等等,每次git status都會顯示Untracked files ...,有強迫症的童鞋心裡肯定不爽。忽略某些檔案時,需要編寫.gitignore;.gitignore檔案本身要放到版本庫裡,並且可以對.gitignore做版本管理。已有gitignore-master檔案供直接使用。

忽略檔案的原則是:
1)忽略作業系統自動產生的檔案,比如縮圖等;
2)忽略編譯產生的中間檔案、可執行檔等,也就是如果一個檔案是通過另一個檔案自動產生的,那自動產生的檔案就沒必要放進版本庫,比如Java編譯產生的.class檔案;
3)忽略你自己的帶有敏感資訊的設定檔,比如存放口令的設定檔。

2、配置別名
$ git config --global alias.st status #告訴Git,以後st就表示status。--global參數是全域參數,也就是這些命令在這台電腦的所有Git倉庫下都有用
$ git config --global alias.co checkout #同理
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.unstage ‘reset HEAD‘
$ git config --global alias.last ‘log -1‘ #顯示最後一次提交資訊
$ git config --global alias.lg "log --color --graph --pretty=format:‘%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset‘ --abbrev-commit"
或者修改設定檔:
每個倉庫的Git設定檔都放在.git/config檔案中
目前使用者的Git設定檔放在使用者主目錄下的一個隱藏檔案.gitconfig中

 

概念:
工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master,以及指向master的一個指標叫HEAD。
為什麼Git比其他版本控制系統設計得優秀,因為Git跟蹤並管理的是修改,而非檔案。


參考文檔:
廖雪峰的Git教程:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

git命令:

 $ git reset --keep <commit>

Publish your tags
$ git push --tags

Get help on the command line
$ git help <command>

git學習筆記

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.