初始化git 配置git 使用Git的第一件事就是設置你的名字和email,這些就是你在提交commit時的簽名,每次提交記錄里都會包含這些信息。使用git config命令進行配置 執行了上面的命令後,會在家目錄( )下建立一個叫 的文件(該文件為隱藏文件,需要使用 查看到). 內容一般像下麵這樣 ...
初始化git
配置git
- 使用Git的第一件事就是設置你的名字和email,這些就是你在提交commit時的簽名,每次提交記錄里都會包含這些信息。使用git config命令進行配置
[root@bogon ~]# git config --global user.name "xiangcl"
[root@bogon ~]# git config --global user.email "[email protected]"
- 執行了上面的命令後,會在家目錄(
/root
)下建立一個叫.gitconfig
的文件(該文件為隱藏文件,需要使用ls -al
查看到). 內容一般像下麵這樣,可以使用vim或cat查看文件內容:
[root@bogon ~]# cat .gitconfig
[user]
name = xiangcl
email = [email protected]
上面的配置文件就是Git全局配置的文件,一般配置方法是
git config --global <配置名稱> <配置的值>
。如果你想使項目里的某個值與前面的全局設置有區別(例如把私人郵箱地址改為工作郵箱),你可以在項目中使用
git config
命令不帶--global
選項來設置. 這會在你當前的項目目錄下創建.git/config
,從而使用針對當前項目的配置。
配置GitHub
註冊GitHub
後續有時間另寫一篇教程,這裡不在贅述...
配置Git
- 在本地創建ssh key:
ubuntu@VM-0-26-ubuntu:~$ sudo ssh-keygen -t rsa -C "[email protected]"
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Ia1lou/M0ZNnLW6Dly9+Ws1kX89Uq5eF9wUBgFGChDA [email protected]
The key's randomart image is:
+---[RSA 2048]----+
| E. o..o+o.... |
| .. .... . |
| o = . .|
| . * . oo|
| . . S +.*|
| . . . . =.=B|
| o +.+.o.oo=|
| + ..=*o. . |
| + ++*. |
+----[SHA256]-----+
顯示如上則表示創建成功。註意,上面命令中的郵箱"[email protected]"
請更換為自己的郵箱,後面密鑰設置密碼,這裡我無需設置,直接一路回車就行。
- 設置成功會在
/root/
下生成一個.ssh
文件,因為要進入/root
目錄,所以需要轉為root身份:
ubuntu@VM-0-26-ubuntu:~$ sudo -s
root@VM-0-26-ubuntu:~# cd /root
root@VM-0-26-ubuntu:/root# cd .ssh/
root@VM-0-26-ubuntu:/root/.ssh# ls -l
total 8
-rw------- 1 root root 1675 May 18 16:14 id_rsa
-rw-r--r-- 1 root root 399 May 18 16:14 id_rsa.pub
- 打開
id_rsa.pub
,複製裡面的key
- 然後粘貼至
GitHub,Settings/SSH and GPG keys/New SSH key
- 使用
ssh -T [email protected]
驗證是否安裝成功
root@VM-0-26-ubuntu:~# ssh -T [email protected]
The authenticity of host 'github.com (192.30.253.112)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.112' (RSA) to the list of known hosts.
Hi xiangcl! You've successfully authenticated, but GitHub does not provide shell access.
按提示輸入yes,看到You've successfully authenticated, but GitHub does not provide shell access則表示連接成功。
獲取一個Git倉庫
既然我們現在把一切都設置好了,那麼我們需要一個Git倉庫。有兩種方法可以得到它:一種是從已有的Git倉庫中clone (克隆,複製);還有一種是新建一個倉庫,把未進行版本控制的文件進行版本控制。
Clone一個倉庫
為了得一個項目的拷貝(copy),我們需要知道這個項目倉庫的地址(Git URL). Git能在許多協議下使用,所以Git URL可能以
ssh://, http(s)://, git://
. 有些倉庫可以通過不只一種協議來訪問。這裡在我的GitHub上提供的一個名字為GitTest的倉庫供大家測試的公有倉庫,這個倉庫可以使用下麵方式進行clone:
[root@bogon ~]# git clone https://github.com/xiangcl/GitTest.git
正克隆到 'GitTest'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.
- clone操作完成後,會發現當前目錄下多了一個GitTest的文件夾,這個文件夾里的內容就是我們剛剛clone下來的代碼。由於當前
GitTest
僅是測試項目,裡面僅有README.md和LICENSE文件。
[root@bogon ~]# cd GitTest/
[root@bogon GitTest]# ls
LICENSE README.md
初始化一個新倉庫
可以對一個已存在的文件夾用下麵的命令讓它置於Git的版本控制管理之下。
- 創建代碼目錄project:
[root@bogon gitproject]# cd ~
[root@bogon ~]# mkdir project
- 進入到代碼目錄,創建並初始化Git倉庫:
[root@bogon ~]# cd project/
[root@bogon project]# git init
初始化空的 Git 版本庫於 /root/project/.git/
通過ls -la
命令會發現project
目錄下會有一個名叫.git
的目錄被創建,這意味著一個倉庫被初始化了。可以進入到.git
目錄查看下有哪些內容。
Git工作流程
git基本工作流程如下:
- 創建或修改文件
- 使用
git add
命令添加新創建或修改的文件到本地的緩存區(Index) - 使用
git commit
命令提交到本地代碼庫 - (可選,有的時候並沒有可以同步的遠端代碼庫)使用
git push
命令將本地代碼庫同步到遠端代碼庫
- 進入我們剛纔建立的project目錄,分別創建文件
file1,file2,file3
:
[root@bogon ~]# cd project/
[root@bogon project]# touch file1 file2 file3
- 修改文件,可以使用vim編輯內容,也可以直接echo添加測試內容。
[root@bogon project]# echo "test" >> file1
[root@bogon project]# echo "test" >> file2
[root@bogon project]# echo "test" >> file3
- 此時可以使用
git status
命令查看當前git倉庫的狀態:
[root@bogon project]# git status
# 位於分支 master
#
# 初始提交
#
# 未跟蹤的文件:
# (使用 "git add <file>..." 以包含要提交的內容)
#
# file1
# file2
# file3
提交為空,但是存在尚未跟蹤的文件(使用 "git add" 建立跟蹤)
可以發現,有三個文件處於未跟蹤(untracked)狀態,下一步我們就需要用git add
命令將他們加入到緩存區(Index)。
- 使用
git add
命令將新建的文件添加到:
[root@bogon project]# git add file1 file2 file3
- 然後再次執行
git status
就會發現新的變化:
[root@bogon project]# git status
# 位於分支 master
#
# 初始提交
#
# 要提交的變更:
# (使用 "git rm --cached <file>..." 撤出暫存區)
#
# 新文件: file1
# 新文件: file2
# 新文件: file3
#
- 你現在為commit做好了準備,你可以使用
git diff
命令再加上 --cached 參數,看看緩存區中哪些文件被修改了。
[root@bogon project]# git diff --cached
如果沒有--cached
參數,git diff
會顯示當前你所有已做的但沒有加入到索引里的修改。
如果你要做進一步的修改, 那就繼續做, 做完後就把新修改的文件加入到緩存區中。
- 當所有新建,修改的文件都被添加到了緩存區,我們就要使用
git commit
提交到本地倉庫:
[root@bogon project]# git commit -m "add 3 files"
[master(根提交) bbb9a52] add 3 files
3 files changed, 3 insertions(+)
create mode 100644 file1
create mode 100644 file2
create mode 100644 file3
需要使用-m
添加本次修改的註釋,完成後就會記錄一個新的項目版本。
- 除了用
git add
命令,我們還可以用下麵的命令將所有沒有加到緩存區的修改也一起提交,但-a命令不會添加新建的文件。
$ git commit -a -m "add 3 files"
再次輸入git status
查看狀態,會發現當前的代碼庫已經沒有待提交的文件了,緩存區已經被清空。
至此,我們完成了第一次代碼提交,這次提交的代碼中我們創建了三個新文件。需要註意的是如果是修改文件,也需要使用git add
命令添加到緩存區才可以提交。如果是刪除文件,則直接使用git rm
命令刪除後會自動將已刪除文件的信息添加到緩存區,git commit
提交後就會將本地倉庫中的對應文件刪除。
為你的項目添加一個新的遠程倉庫
本地倉庫是創建完成了,現在需要與遠程的倉庫進行鏈接。
[root@bogon project]# git remote
[root@bogon project]# git remote add origin [email protected]:xiangcl/project.git
[root@bogon project]# git remote -v
origin [email protected]:xiangcl/project.git (fetch)
origin [email protected]:xiangcl/project.git (push)
推送到遠程倉庫
這個時候如果本地的倉庫連接到了遠程Git伺服器,可以使用下麵的命令將本地倉庫同步到遠端伺服器:(註意,需要與遠程倉庫連接)
[root@bogon project]# git push -u origin master
Warning: Permanently added the RSA host key for IP address '192.30.255.113' to the list of known hosts.
Counting objects: 14, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (14/14), 1.16 KiB | 0 bytes/s, done.
Total 14 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), done.
To [email protected]:xiangcl/project.git
* [new branch] master -> master
分支 master 設置為跟蹤來自 origin 的遠程分支 master。
上面使用git push
時帶上了-u
參數,是將本地的master分支推送到origin主機,同時指定origin為預設主機,後面就可以不加任何參數使用git push了。
從遠端倉庫下載新分支與數據
git fetch
會訪問遠程倉庫,從中拉取所有你還沒有的數據。 執行完成後,你將會擁有那個遠程倉庫中所有分支的引用,可以隨時合併或查看。
[root@bogon project]# git remote -v
origin [email protected]:xiangcl/project.git (fetch)
origin [email protected]:xiangcl/project.git (push)
[root@bogon project]# git fetch origin
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
來自 github.com:xiangcl/project
6c3b072..4d38d99 master -> origin/master
git fetch origin
會抓取從你上次克隆以來別人上傳到此遠程倉庫中的所有更新(或是上次 fetch 以來別人提交的更新)。有一點很重要,需要記住,fetch 命令只是將遠端的數據拉到本地倉庫,並不自動合併到當前工作分支,只有當你確實準備好了,才能手工合併。
- 查看分支
git branch命令的-r選項,可以用來查看遠程分支,-a選項查看所有分支。
[root@bogon project]# git branch -r
origin/master
[root@bogon project]# git branch -a
* master
remotes/origin/master
上面命令表示,本地主機的當前分支是master,遠程分支是origin/master。
- 取回遠程主機的更新以後,可以在它的基礎上,使用
git checkout
命令創建一個新的分支。
[root@bogon project]# git checkout -b newBrack origin/master
分支 newBrack 設置為跟蹤來自 origin 的遠程分支 master。
切換到一個新分支 'newBrack'
上面命令表示,在origin/master的基礎上,創建一個新分支。
- 此外,也可以使用
git merge
命令或者git rebase
命令,在本地分支上合併遠程分支。
[root@bogon project]# git merge origin/master
Already up-to-date.
[root@bogon project]# ls
file1 file2 file3 README.md
上面命令表示在當前分支上,合併origin/master。此時使用ls
就可以查看到我剛剛在倉庫段創建的README.md文件了
分支與合併
Git的分支可以讓你在主線(master分支)之外進行代碼提交,同時又不會影響代碼庫主線。分支的作用體現在多人協作開發中,比如一個團隊開發軟體,你負責獨立的一個功能需要一個月的時間來完成,你就可以創建一個分支,只把該功能的代碼提交到這個分支,而其他同事仍然可以繼續使用主線開發,你每天的提交不會對他們造成任何影響。當你完成功能後,測試通過再把你的功能分支合併到主線。
分支
- 一個Git倉庫可以維護很多開發分支。現在我們來創建一個新的叫 experimental的分支:
[root@bogon project]# git branch experimental
- 運行git branch命令可以查看當前的分支列表,已經目前的開發環境處在哪個分支上:
[root@bogon project]# git branch
experimental
* master
- experimental 分支是你剛纔創建的,master分支是Git系統預設創建的主分支。星號標識了你當工作在哪個分支下,輸入git checkout 分支名可以切換到其他分支:
[root@bogon project]# git checkout experimental
切換到分支 'experimental'
- 切換到experimental分支,切換完成後,先編輯裡面的一個文件,再提交(commit)改動,最後切換回 “master”分支:
[root@bogon project]# echo "update" >> file1 # 修改file1文件
[root@bogon project]# git status # 使用 git status 查看當前狀態
# 位於分支 experimental
# 尚未暫存以備提交的變更:
# (使用 "git add <file>..." 更新要提交的內容)
# (使用 "git checkout -- <file>..." 丟棄工作區的改動)
#
# 修改: file1
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@bogon project]# git add file1 # 添加並提交file1的更改
[root@bogon project]# git commit -m "update file1"
[experimental 3251fbe] update file1
1 file changed, 1 insertion(+)
[root@bogon project]# cat file1 #查看file1文件的內容
test
update
[root@bogon project]# git checkout master #切換至master分支
切換到分支 'master'
查看下file1中的內容會發現剛纔做的修改已經看不到了。因為剛纔的修改時在experimental分支下,現在切換回了master分支,目錄下的文件都是master分支上的文件了。
- 現在可以在master分支下再作一些不同的修改:
[root@bogon project]# echo 'update again' >> file2 #修改file2文件
[root@bogon project]# git status #查看當前狀態
# 位於分支 master
# 尚未暫存以備提交的變更:
# (使用 "git add <file>..." 更新要提交的內容)
# (使用 "git checkout -- <file>..." 丟棄工作區的改動)
#
# 修改: file2
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@bogon project]# git add file2 #添加並調教file2的修改
[root@bogon project]# git commit -m "update file2 on master"
[master 7f50340] update file2 on master
1 file changed, 1 insertion(+)
[root@bogon project]# cat file2 #查看file2的修改
test
update again
這時,兩個分支就有了各自不同的修改,分支的內容都已經不同,如何將多個分支進行合併呢?
- 可以通過下麵的git merge命令來合併experimental到主線分支master:
[root@bogon project]# git checkout master # 切換至master 分支
已經位於 'master'
[root@bogon project]# git merge -m "merge experimental branch" experimental #將 experimental 分支合併至master分區
Merge made by the 'recursive' strategy.
file1 | 1 +
1 file changed, 1 insertion(+)
-m參數仍然是需要填寫合併的註釋信息。
由於兩個branch修改了兩個不同的文件,所以合併時不會有衝突,執行上面的命令後合併就完成了。
- 如果有衝突,比如兩個分支都改了一個文件file3,則合併時會失敗。首先我們在master分支上修改file3文件並提交:
[root@bogon project]# git checkout master # 切換至 master 分區
已經位於 'master'
[root@bogon project]# echo "master:update file3" >> file3 # 修改 file3 文件
[root@bogon project]# git status # 查看當前狀態
# 位於分支 master
# 尚未暫存以備提交的變更:
# (使用 "git add <file>..." 更新要提交的內容)
# (使用 "git checkout -- <file>..." 丟棄工作區的改動)
#
# 修改: file3
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@bogon project]# git commit -a -m 'update file3 on master' #提交至master分區
[master 2922456] update file3 on master
1 file changed, 1 insertion(+)
[root@bogon project]# git status #在次查看狀態
# 位於分支 master
無文件要提交,乾凈的工作區
- 然後切換到experimental,修改file3並提交:
[root@bogon project]# git checkout experimental # 切換至 experimental 分支
切換到分支 'experimental'
[root@bogon project]# echo "experimental: update file3" >> file3 # 修改 file3 文本
[root@bogon project]# git commit -a -m 'update file3 on experimental' # 提交至experimental 分支
[experimental e511488] update file3 on experimental
1 file changed, 1 insertion(+)
- 切換到master進行合併:
[root@bogon project]# git checkout master # 切換至 master 分支
切換到分支 'master'
[root@bogon project]# git merge experimental # 合併分支
自動合併 file3
衝突(內容):合併衝突於 file3
自動合併失敗,修正衝突然後提交修正的結果。
- 合併失敗後先用git status查看狀態,會發現file3顯示為both modified,查看file3內容會發現:
[root@bogon project]# git status #查看狀態
# 位於分支 master
# 您有尚未合併的路徑。
# (解決衝突並運行 "git commit")
#
# 未合併的路徑:
# (使用 "git add <file>..." 標記解決方案)
#
# 雙方修改: file3
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@bogon project]# cat file3 # 查看產生衝突的文件
test
<<<<<<< HEAD
master:update file3
=======
experimental: update file3
>>>>>>> experimental
上面的內容也可以使用git diff查看,先前已經提到git diff不加參數可以顯示未提交到緩存區中的修改內容。
- 可以看到衝突的內容都被添加到了file3中,我們使用vim編輯這個文件,去掉git自動產生標誌衝突的<<<<<<等符號後,根據需要只保留我們需要的內容後保存,然後使用git add file3和git commit命令來提交合併後的file3內容,這個過程是手動解決衝突的流程。
[root@bogon project]# vim file3 # 使用 vim 打開文件修改
[root@bogon project]# git status #查看狀態
# 位於分支 master
# 您有尚未合併的路徑。
# (解決衝突並運行 "git commit")
#
# 未合併的路徑:
# (使用 "git add <file>..." 標記解決方案)
#
# 雙方修改: file3
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@bogon project]# git add file3 # 將文件加入緩存
[root@bogon project]# git status # 再次查看狀態
# 位於分支 master
# 所有衝突已解決但您仍處於合併中。
# (使用 "git commit" 結束合併)
#
# 要提交的變更:
#
# 修改: file3
#
[root@bogon project]# git commit -m 'merge file3' # 提交修改的文件
[master 6b63f36] merge file3
- 當我們完成合併後,不再需要experimental時,可以使用下麵的命令刪除:
[root@bogon project]# git branch -d experimental
已刪除分支 experimental(曾為 e511488)。
git branch -d只能刪除那些已經被當前分支的合併的分支. 如果你要強制刪除某個分支的話就用git branch –D
撤銷一個合併
- 如果你覺得你合併後的狀態是一團亂麻,想把當前的修改都放棄,你可以用下麵的命令回到合併之前的狀態:
[root@bogon project]# git reset --hard HEAD^
HEAD 現在位於 2922456 update file3 on master
[root@bogon project]# cat file3
test
master:update file3
推送至遠程倉庫
- 在本機完成改動後就可以提交到遠程倉庫了
git push origin master
可以把 master 換成你想要推送的任何分支。
- 如果你還沒有克隆現有倉庫,並欲將你的倉庫連接到某個遠程伺服器,你可以使用如下命令添加:
git remote add origin <server>
如此你就能夠將你的改動推送到所添加的伺服器上去了。
更新與合併
- 要更新你的本地倉庫至最新改動,執行:
git pull
以在你的工作目錄中 獲取(fetch) 並 合併(merge) 遠端的改動。
- 要合併其他分支到你的當前分支(例如 master),執行:
git merge <branch>
- 在這兩種情況下,git 都會嘗試去自動合併改動。遺憾的是,這可能並非每次都成功,並可能出現衝突(conflicts)。 這時候就需要你修改這些文件來手動合併這些衝突(conflicts)。改完之後,你需要執行如下命令以將它們標記為合併成功:
git add <filename>
- 在合併改動之前,你可以使用如下命令預覽差異:
git diff <source_branch> <target_branch>
歡迎訪問我的個人Blog:xiangcl.com