github使用

參考廖雪峯教程
主要是windows上的操作。在其他系統命令一樣。

github簡介

git是一個分佈式版本控制系統,非常好用。

瞭解一下

github在內的版本控制系統都是追蹤文本文件的變化。

安裝

github現在已經支持Linux、Unix、Mac和Windows。

  • linux安裝

  • mac安裝

  • windows安裝
    注意:安裝完後需要進行簡單設置

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

git config命令的–global參數,用了這個參數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的用戶名和Email地址

這裏寫代碼片

創建新倉庫

在windows上我們創建一個空的倉庫需要兩步:新建一個文件夾和初始化倉庫。
初始化倉庫命令:

git init

初始化完成後會提示初始化了一個空的倉庫。
說明:
1.在windows上需要在倉庫文件夾下打開git bash來輸入命令,當然你可以在其他地方打開,但是需要將目錄切換到這個倉庫文件夾.
2.其實我們也可以在任何文件夾下使用這個命令,同樣將會讓這個文件夾變成一個git倉庫。
3.初始化後會生成一個.git的隱藏目錄,這個目錄其實版本庫,不要亂動。
4.git bash就像linux下的中端,同時可以用linux下的命令,包括使用vim(剛發現)。

向倉庫添加文件

首先在倉庫文件夾下新建一個文件或者複製一個文件過來,如需要添加的文件是readme.txt。然後進行如下操作:

git add readme.txt
git commit -m "wrote a readme file"

說明:
1.add命令後可跟多個文件。
2.commit是一次性提交之前所有add的文件,-m參數是給這次提交添加說明。

查看倉庫狀態和文件修改內容

查看倉庫當前狀態(文件修改狀態)

git status

查看文件修改內容(還未提交的文件和提交到倉庫中的版本比較)

git diff

修改文件的保存

和向倉庫中添加文件一樣

git add
git commit

版本回退

查看日誌(很長的那一串叫做提交版本號)

git log //--pretty=oneline參數可以顯示的更簡潔

$ git log --pretty=oneline
d758dfb6b79f4ea6c9dc2b65646e85ff12c08fd2 commit test.txt
ccedebaf25c4348afa94113108c1505a9c93c100 first change the text
7f686478bd41e31a94ef75eb3f0eeee4e51c5099 add readme.txt

在git中可以使用命令在已經提交過的版本那種來回任意穿梭。
回到之前的某個版本,在git中HEAD表示當前版本,^表示前一個版本,可以有多個^,但是如果回到的版本太過靠前,如回到之前100個版本可用HEAD~100。

git reset --hard HEAD^
git reset

版本回退後我們看不到這個版本之後的版本了。但是如果想恢復還是可以的。這是需要通過我們想要恢復的那個版本的commit版本號(如果你之前通過git log查看過就可以在命令行中找到),版本號不必寫全。

git reset --hard 7f6864

如果在進行上述操作後,又退回之前某個版本,並且這次關閉了電腦。你若是想在回到之前的版本,可以通過

git reflog

查看歷史操作命令,來找到 git reset –hard 7f6864 這條命令,然後用這個版本號來回退到該版本。
如果你沒有版本號好像是有點難已恢復。

工作區和版本庫

工作區

就是我們建的這個文件夾。

版本庫

在我們使用命令 git init 初始化倉庫時生成的隱藏目錄.git就是我們的版本庫。

暫存區

Git的版本庫裏存了很多東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,
同時Git爲我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD,在上面版本回退中已經使用過這個head。
在上面我們想倉庫中添加文件時執行了兩個命令:git add 和 git commit。前者 其實就是將工作區的文件添加到暫存區,而後者就是將所有暫存區的文件加入到版本庫得到一個最新的版本。
圖來源於廖雪峯教程
這裏寫圖片描述
上面的git status命令就是查看的文件修改的在工作區、暫存區和版本庫的情況。

管理修改

在git中,它管理的是文本文件的修改,實際上在上面向版本庫中添加和提交的是對文件的修改,比如我們就行這樣的操作:第一次修改 -> git add -> 第二次修改 -> git commit。實際上這裏就只是將第一次修改加入了版本庫。

撤銷修改

如果我們在工作區對文件進行了修改,但是我們想撤銷這些工作區的修改,可以使用命令

git checkout -- filename

這個命令可以讓我們的文件回到最近一次git add或git commit的版本狀態。
但是如果我們已經將文件的修改添加到了暫存區,我們可以使用命令

git reset HEAD <file>

撤銷暫存區的修改到工作區。如果想繼續撤銷修改到之前的版本,再繼續用git checkout – filename命令。
如果我們修改了文件並且還已經commit到了版本庫,發現修改錯誤,不急,可以版本回退到之前的版本。

刪除文件

刪除工作取文件,直接delete或者rm命令。但是並沒有刪除版本庫中的文件。因此如果你誤刪工作區的文件還可以通過版本庫來恢復,使用命令

git checkout -- filename

來恢復,這個命令其實是用版本庫中最新的版本來替換工作區的版本。

從版本庫刪除文件使用命令

git rm
git commit //這裏也可用 git add命令

如果你把版本庫的文件版本刪了,無法恢復。

遠程倉庫

遠程倉庫可以用來進行備份,也可以用來和他人協作,想使用遠程倉庫,需要到github官網註冊賬號,github提供免費的倉庫託管服務,或者你自己搞個服務器也行。
註冊完賬號後,新建一個倉庫,然後就可以關聯本地倉庫和這個遠程倉庫了。但是因此倉庫之間的傳輸時通過SSH加密,爲了確保是本人推送,所以在關聯前你需要將自己的SSH公鑰添加到自己賬號下。github需要添加多個SSH公鑰,因此你可以在多臺電腦上推送。

創建SSH key

在linux終端或者git bash裏面輸入命令

ssh-keygen -t rsa -C "[email protected]"

一路回車,使用默認配置。
然後就可以到用戶主目錄下找到了。比如我的目錄是

C:\Users\dhc\.ssh

裏面有id_rsa和id_rsa.pub兩個文件,這兩個就是SSH Key的祕鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
而我們就是將公鑰添加到github網站的賬號裏。
注意github的倉庫都是開源的,他人不能修改但是可以看到,因此不宜放私密文件,如果想使用私有倉庫,可以交錢或者自己搞個服務器。

關聯遠程倉庫

關聯前我們先創建一個遠程倉庫,創建時除了名字,其他保持默認設置。創建完之後,我們就可以和它關聯,然後就可以將自己本地倉庫中的文件推送到遠程倉庫,也可以從遠程倉庫克隆。
使用命令

$ git remote add origin git@github.com:breezeDHC/Simple-Spider.git //後面使用自己的倉庫地址

來關聯,origin是默認的遠程倉庫名,可以更改。

推送到遠程倉庫

使用命令

$ git push -u origin master

由於遠程庫是空的,我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令,不用-u參數了。

克隆遠程倉庫到本地

使用命令

$ git clone git@github.com:breezeDHC/Simple-Spider.git //後面使用自己的倉庫地址

Git支持多種協議,默認的git://使用ssh,但也可以使用https等其他協議。
使用https除了速度慢以外,還有個最大的麻煩是每次推送都必須輸入口令,但是在某些只開放http端口的公司內部就無法使用ssh協議而只能用https

分支管理(git鼓勵使用分支)

當我們多人協作時,使用分支是一種很安全的方法。
git把我們每次提交串成一條時間線,如果我們不另外創建分支的話,默認的只有一個master主分支。
在上面版本回退時使用過的HEAD實際上是指向當前分支的指針,即在主分支時其實是HEAD指向master,master才指向當前分支的當前提交版本。當我們創建分支,如b1,並且切換到分支b1時,這時就是HEAD指向b1。
並且我們在不同的分支上進行文件的修改提交是互不影響的,比如我們在b1分支上對某個文件進行了修改並且比較到版本庫,我們在其他分支看到的任然是修改前的版本。
如果我們想要讓其他某個分支的修改更新到自己分支,可以用分支合併。

有關命令如下:

git branch //查看所有分支和當前所在分支
git branch 分支名 //創建分支
git checkout 分支名    //切換分支
git checkout -b 分支名 //創建分支並切換到分支
git merge 分支名    //將分支合併到當前分支(好像不能講較新版本的分支合併到舊版本的分支)
git branch -d 分支名 //刪除分支

分支合併衝突

當我們在不同分支上對同一個文件進行了修改後並且都提交到了各自的版本庫,這是如果我們合併的會產生衝突,無法合併,如果這是你查看文件就會像

<<<<<<< HEAD
change on master
=======
change on b1
>>>>>>> b1

這樣其中<<<<<<、=======、>>>>>>>>是表示文件中衝突的部分。
遇到衝突我們需要手動對文件進行修改合併,然後在使用

git add
git commit

命令,即可。
遇到衝突時,也可以通過git status查看衝突情況。
使用命令

git log --graph 

可以查看分支合併情況。

分支管理策略

在上面Git合併分支時用的是Fast forward模式,但這種模式下,刪除分支後,會丟掉分支信息。如果我們不適用這種模式合併時會生成一個新的commit,在分支歷史上就可以看到分支信息。
使用命令

$ git merge --no-ff -m "merge with no-ff" b1

其中 –no-ff表示不使用 fast forward模式,因爲生成新的commit因此用-m增加說明。

$ git log --graph --pretty=oneline --abbrev-commit
*   e1e9c68 (HEAD -> master) merge with no-ff
|\  
| * f52c633 (dev) add merge
|/  
*   cf810e4 conflict fixed

分支策略
master分支應該是穩定,一般僅僅用來合併比較完善的代碼,一般多人合作時每個人有自己的分支,這個是每個人的工作分支,提交時也不應直接提交到master分支,而是先保存到一個專門的分支,當這個分支代碼完善在提交到master分支上。

bug分支和保存現場

一般我們解決某個bug時,會新建一個分支來解決,解決完之後然後合併到master。
當我們在分支b1上進行工作時,但是還沒有工作完所以還不能提交,但是必須要先解決解決bug,這是如果直接切回master創建bug分支進行解決合併可能會影響到b1分支,這是我們可以先保存b1分支的工作現場,當解決完後再回復即可。
使用命令

git stash

保存現場。
恢復現場時可用命令

git stash pop     //恢復到現場並刪除stash內容
git stash apply   //恢復不刪除
git stash drop     //刪除stash內容

好像是保存的是暫存區的工作現場,也就是說你要先git add到暫存區。

feature分支(強制刪除未合併的新分支)

當我們開發新功能時,和解決bug一樣,新建一個分支,功能晚上後,在合併刪除,但是如果功能完善後,我們不需要這個分支上的內容,需要刪除這時需要強制刪除,使用命令

git branch -D 分支名

多人協作

從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,並且,遠程倉庫的默認名稱是origin。
查看遠程庫信息

git remote
git remote -v

推送本地分支到遠程庫對應分支

git push origin master    //將推送到主分支

並不需要將自己本地所有分支推送到遠程。
如果遠程庫不存在這個分支,會建立這個分支。

多人協作時推送會存在衝突。
衝突1:比如你的某個小夥伴增加了一個文件或者修改了一個文件,當你推送時會推送失敗,這時是需要將你的小夥伴增加的文件或者修改的文件更新到自己的分支版本庫,使用命令

git pull

這時再推送就可以了。
衝突2:你推送的版本是和你的小夥伴推送的區別只是你們修改了同一個文件,這時就象上面的合併分支衝突一樣,需要先git pull下來,這時你可以看到小夥伴和你修改的不同,這時就和上面一樣要手動解決衝突,然後git add、git commit、git push。命令如下

git push      //衝突
git pull      //將小夥伴的修改更新到自己的版本庫中
修改解決衝突
git add 
git commit 
git push

如果我們需要在遠程倉庫的某個如dev分支工作,則需要將遠程的分支同步到本地,使用命令

git checkout -b dev origin/dev

然後就可以在本地工作,然後推送到遠程倉庫。
git pull時可能會提示no tracking information,則說明本地分支和遠程分支的鏈接關係沒有創建,因此使用命令

git branch --set-upstream-to <branch-name> origin/<branch-name>

來建立連接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章