學習Git,需要推薦一下廖雪峰老師的Git教程:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
另外還有兩篇git的文章挺好的:
https://www.yiibai.com/git/git_handling_conflicts.html
https://blog.csdn.net/xiaokang123456kao/article/details/70921259
0.git基本操作
git init ##創建git倉庫
git add xxx ##將本地文件xxx的修改提交到暫存區
git commit -m "mx" ##將暫存區的所有修改修改提交到倉庫當中
git reset --hard HEAR^ ##本地目錄恢復到上一個版本
git reset --hard xxx ##恢復本地目錄至版本xxx
git log ##查看提交日記
git status ##顯示工作目錄和暫存區的狀態
git diff ##比較當前文件和暫存區文件的差異
git diff HEAR HEAR^
eg:
samuel@franz_z$ mkdir learngit
samuel@franz_z$ cd learngit/
samuel@learngit$ ls -a
. .. hobbys
samuel@learngit$ cat hobbys ##查看hobbys文件內容
#HOBBYS LIST
running
swimming
samuel@learngit$ git init ##創建git倉庫
初始化空的 Git 倉庫於 /home/samuel/work/franz_z/learngit/.git/
samuel@learngit$ ls -a ##learngit目錄下多了.git目錄
. .. .git hobbys
samuel@learngit$ git add hobbys ##將hobbys文件提交到暫存區
samuel@learngit$ git commit -m "init learngit project" ##將learngit下修改提交到倉庫
[master (根提交) abe2f4f] init learngit project
1 file changed, 3 insertions(+)
create mode 100644 hobbys
samuel@learngit$ git log ##查看版本
commit abe2f4f3dc56942c22a98bf2a07380bae8e263ce
Author: samauel <samauel.zhou@honeywell.com>
Date: Mon Oct 29 14:03:55 2018 +0800
init learngit project
修改hobbys文件后繼續提交
samuel@learngit$ echo "playing football" >> hobbys
samuel@learngit$ cat hobbys
#HOBBYS LIST
running
swimming
playing football
samuel@learngit$ git add hobbys
samuel@learngit$ git commit -m "add a new hobby"
[master 4a56f9a] add a new hobby
1 file changed, 1 insertion(+)
samuel@learngit$ git log
commit 4a56f9a14a29542b2d8cf92c317ba198595a5321
Author: samauel <samauel.zhou@honeywell.com>
Date: Mon Oct 29 14:09:54 2018 +0800
add a new hobby
commit abe2f4f3dc56942c22a98bf2a07380bae8e263ce
Author: samauel <samauel.zhou@honeywell.com>
Date: Mon Oct 29 14:03:55 2018 +0800
init learngit project
1.查看遠程倉庫
git remote #查看遠程倉庫(簡單描述)
git remote -v #查看遠程倉庫(詳盡描述)
2.添加遠程倉庫
git remote add origin git@github.com:Franzzt/xxx.git ##添加名為origin的遠程倉庫
3.移除遠程倉庫
git remote rm origin
4.從倉庫中獲取源碼
git clone 倉庫地址
git checkout -b dev origin/dev ##checkou遠程分支dev,在本地起名為dev,並切換到分支dev
倉庫中獲取源碼分為兩種方式:
1.獲取所有的項目源碼,
git clone git@github.com:Franzzt/learngit.git 下載整個項目的源碼
2.獲取單個分支的源碼
git clone -b origin/dev git@github.com:Franzzt/learngit.git 只下載分支dev的源碼
不同的是下載整個項目的源碼之后可以在整個項目的所有分支中來回切換,而下載單個分支的動作之后則無法
在切換到其他分支
5.本地更新推送至遠程倉庫
git push <遠程主機名> <本地分支名>:<遠程分支名>
git push -u origin master ##推送主分支master到倉庫origin
git push -u origin feature-A ##推送分支feature-A到倉庫feature-A
git push 推送當前分支到倉庫
6.遠程倉庫更新至本地
git pull <遠程主機名> <遠程分支名>:<本地分支名> ##取回遠程庫更新,並與本地分支合並
git pull origin dev
git fetch ##將遠程的所有分支跟新到本地
git fetch <遠程主機名> <分支名> ##取回遠程特定分支的更新
git fetch origin
git merge origin/next
7.分支操作
git branch ##查看本地分支
git branch -r ##查看遠程分支
git branch -a ##查看所有分支
git branch feature ##以當前所在分支創建新分支feature
git checkout feature ##切換到分支feature
git checkout -b feature ##創建分支feature並切換到分支feature
git merge feature ##將分支feature內容合並到當前所在分支
git branch -d feature ##刪除本地分支feature
git push origin --delete feature ##刪除遠程倉庫分支feature
git push origin dev ##推送分支dev至遠程倉庫
git branch --set-upstream-to=origin/dev dev # 建立本地分支和遠程分支的關聯
假如本地有很多分支,哪些分支需要推送到遠程倉庫中呢?一般是這樣的,
master分支是主分支,要時刻與遠程同步,一般我們發布最新版本就用master分支。
develop分支是開發分支,團隊中所有人都在這個分支上開發,所以也需要與遠程同步。
bug分支一般只在本地使用來修復bug,一般不需推送遠程倉庫中。
feature分支是否需要推送到遠程,要看是不是有幾個人合作開發新功能,如果你是一個開發,那就留在本地吧。
release分支一般是系統管理,推送或抓取的分支一般與開發人員無關。
other分支按需求分配。
多人協作
1.github上創建倉庫(倉庫地址:git@giithub.com:Franzzt/xxx.git)
2.git init
3.git remote add origin git@giithub.com:Franzzt/xxx.git
git remote(查看)
4.git add tset.txt
5.git commit -m "first file"
6.git push -u origin master
7.git checkout -b devlop
8.git add text.txt
9.git commit -m "add text.txt file to branch devlop"
10.git push -u origin devlop
11.git checkout master
12.git merge devlop
13.git fetch origin master
14.git diff
15.git add
16.git commit -m
17.git push origin master
18.git pull origin master
19.git git branch --set-upstream-to=origin/devlop
20.modify file
/
18.git fetch origin master
19.git diff
20.git merge
1.從github上獲取項目源碼
samuel@franz_z$ git clone git@github.com:Franzzt/learngit.git
正克隆到 'learngit'...
remote: Enumerating objects: 12, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 12 (delta 1), reused 5 (delta 0), pack-reused 0
接收對象中: 100% (12/12), 完成.
處理 delta 中: 100% (1/1), 完成.
檢查連接... 完成。
samuel@franz_z$ ls
backup learngit linux-imx uboot-imx
2.創建新文件或修改文件后提交
samuel@learngit$ vim gitlearn.txt
samuel@learngit$ cat gitlearn.txt
Hello world
Juset learngit
samuel@learngit$ git add gitlearn.txt
samuel@learngit$ git commit -m "create a new file learngit"
[master 6c47d1b] create a new file learngit
1 file changed, 2 insertions(+)
create mode 100644 gitlearn.txt
3.推送本地目錄更新至遠程倉庫
samuel@learngit$ git push origin master
對象計數中: 3, 完成.
Delta compression using up to 4 threads.
壓縮對象中: 100% (2/2), 完成.
寫入對象中: 100% (3/3), 317 bytes | 0 bytes/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:Franzzt/learngit.git
0c584e5..6c47d1b master -> master
4.創建分支修改文件以及合並
samuel@learngit$ git checkout -b devlop
切換到一個新分支 'devlop'
samuel@learngit$ git branch
* devlop
master
samuel@learngit$ git add learngit.txt
samuel@learngit$ git commit -m "add a new file learngit"
[devlop 6149333] add a new file learngit
1 file changed, 2 insertions(+)
create mode 100644 learngit.txt
samuel@learngit$ ls
gitlearn.txt learngit.txt README.md
samuel@learngit$ git checkout master
切換到分支 'master'
您的分支與上游分支 'origin/master' 一致。
samuel@learngit$ ls
gitlearn.txt README.md
samuel@learngit$ git merge devlop
更新 6c47d1b..6149333
Fast-forward
learngit.txt | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 learngit.txt
samuel@learngit$ ls
gitlearn.txt learngit.txt README.md
samuel@learngit$ git checkout devlop
切換到分支 'devlop'
samuel@learngit$ vim learngit.txt
samuel@learngit$
samuel@learngit$ git add learngit.txt
samuel@learngit$ git commit -m "modify file learngit"
[devlop 83b22bc] modify file learngit
1 file changed, 1 insertion(+)
samuel@learngit$ git checkout master
切換到分支 'master'
您的分支領先 'origin/master' 共 1 個提交。
(使用 "git push" 來發布您的本地提交)
samuel@learngit$ vim learngit.txt
samuel@learngit$ git add learngit.txt
samuel@learngit$ git commit -m "modify file learngit"
[master c4cbc1e] modify file learngit
1 file changed, 1 insertion(+)
samuel@learngit$ git branch
devlop
* master
samuel@learngit$ git merge devlop
自動合並 learngit.txt
沖突(內容):合並沖突於 learngit.txt
自動合並失敗,修正沖突然后提交修正的結果。
samuel@learngit$ git diff
diff --cc learngit.txt
index 215a818,53dc181..0000000
--- a/learngit.txt
+++ b/learngit.txt
@@@ -1,3 -1,3 +1,7 @@@
#Create new file learngit
#HAHAHA
++<<<<<<< HEAD
+Git is a tool very userful
++=======
+ GIt is very userful
++>>>>>>> devlop
samuel@learngit$ vim learngit.txt
samuel@learngit$
samuel@learngit$ git add learngit.txt
samuel@learngit$ git commit -m "final modify"
[master c003791] final modify
5.本地分支提交沖突
法1:
samuel@learngit$ git push origin master
To git@github.com:Franzzt/learngit.git
! [rejected] master -> master (non-fast-forward)
error: 無法推送一些引用到 'git@github.com:Franzzt/learngit.git'
提示:更新被拒絕,因為您當前分支的最新提交落后於其對應的遠程分支。
提示:再次推送前,先與遠程變更合並(如 'git pull ...')。詳見
提示:'git push --help' 中的 'Note about fast-forwards' 小節。
samuel@learngit$ git pull
自動合並 gitlearn.txt
沖突(內容):合並沖突於 gitlearn.txt
自動合並失敗,修正沖突然后提交修正的結果。
samuel@learngit$ vim gitlearn.txt
samuel@learngit$
samuel@learngit$ git diff
diff --cc gitlearn.txt
index b7ed434,73b15b1..0000000
--- a/gitlearn.txt
+++ b/gitlearn.txt
@@@ -1,4 -1,4 +1,8 @@@
Hello world
Juset learngit
I am learning how to use git
++<<<<<<< HEAD
+Help with pronunciation
++=======
+ Can you help me find a few things
++>>>>>>> 7093398c620fccd49322a735756c22963cb41699
samuel@learngit$
samuel@learngit$ vim learngit.txt
samuel@learngit$ vim learngit.txt
samuel@learngit$ vim gitlearn.txt
samuel@learngit$ git add gitlearn.txt
samuel@learngit$ git commit -c "change gitlearn.txt"
fatal: 不能查詢提交 change gitlearn.txt
samuel@learngit$ git commit -m "change gitlearn.txt"
[master cc5ba66] change gitlearn.txt
samuel@learngit$ git push origin master
對象計數中: 20, 完成.
Delta compression using up to 4 threads.
壓縮對象中: 100% (19/19), 完成.
寫入對象中: 100% (20/20), 2.13 KiB | 0 bytes/s, 完成.
Total 20 (delta 4), reused 0 (delta 0)
remote: Resolving deltas: 100% (4/4), done.
To git@github.com:Franzzt/learngit.git
7093398..cc5ba66 master -> master
法2.
samuel@franz_z$ cat bcd
samuel@learngit$ git push origin master
To git@github.com:Franzzt/learngit.git
! [rejected] master -> master (fetch first)
error: 無法推送一些引用到 'git@github.com:Franzzt/learngit.git'
提示:更新被拒絕,因為遠程倉庫包含您本地尚不存在的提交。這通常是因為另外
提示:一個倉庫已向該引用進行了推送。再次推送前,您可能需要先整合遠程變更
提示:(如 'git pull ...')。
提示:詳見 'git push --help' 中的 'Note about fast-forwards' 小節。
samuel@learngit$ git fetch origin master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
展開對象中: 100% (3/3), 完成.
來自 github.com:Franzzt/learngit
* branch master -> FETCH_HEAD
cc5ba66..3c47049 master -> origin/master
samuel@learngit$ git diff
samuel@learngit$ git fetch
samuel@learngit$ git diff
samuel@learngit$ ls
gitlearn.txt learngit.txt README.md
samuel@learngit$ vim gitlearn.txt
samuel@learngit$
samuel@learngit$
samuel@learngit$ git fetch origin master:master
fatal: 拒絕獲取到非純倉庫的當前分支 refs/heads/master
samuel@learngit$ git diff
samuel@learngit$
samuel@learngit$ git diff gitlearn.txt
samuel@learngit$
samuel@learngit$
samuel@learngit$ git fetch origin/master
fatal: 'origin/master' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
samuel@learngit$
samuel@learngit$
samuel@learngit$ git fetch origin master
來自 github.com:Franzzt/learngit
* branch master -> FETCH_HEAD
samuel@learngit$ git diff
samuel@learngit$
samuel@learngit$ vim gitlearn.txt
samuel@learngit$
samuel@learngit$ vim gitlearn.txt
samuel@learngit$
samuel@learngit$ git status
位於分支 master
您的分支和 'origin/master' 出現了偏離,
並且分別有 1 和 1 處不同的提交。
(使用 "git pull" 來合並遠程分支)
無文件要提交,干凈的工作區
samuel@learngit$ git log
commit ba27af8ce62d12a16d21bc51b2f266e723a0b9a0
Author: samauel <samauel.zhou@honeywell.com>
Date: Mon Oct 29 17:15:30 2018 +0800
modify gitlearn.txt
commit cc5ba66e86644b9d12c6d751f201beabdac54f15
Merge: f52ac0b 7093398
Author: samauel <samauel.zhou@honeywell.com>
Date: Mon Oct 29 17:13:25 2018 +0800
change gitlearn.txt
commit f52ac0be922b23c73eeafa99b81ac6b75a9b6288
Author: samauel <samauel.zhou@honeywell.com>
Date: Mon Oct 29 17:10:19 2018 +0800
modify gitlearngit.txt
commit 7093398c620fccd49322a735756c22963cb41699
Author: Franzzt <40494721+Franzzt@users.noreply.github.com>
Date: Mon Oct 29 17:06:13 2018 +0800
samuel@learngit$ git fetch origin
samuel@learngit$ git merge master
Already up-to-date.
samuel@learngit$ ls
gitlearn.txt learngit.txt README.md
samuel@learngit$ vim gitlearn.txt
samuel@learngit$ git merge origin/master
自動合並 gitlearn.txt
沖突(內容):合並沖突於 gitlearn.txt
自動合並失敗,修正沖突然后提交修正的結果。
samuel@learngit$ git diff
diff --cc gitlearn.txt
index 1e0cbe0,4c58b0f..0000000
--- a/gitlearn.txt
+++ b/gitlearn.txt
@@@ -2,4 -2,4 +2,8 @@@ Hello worl
Juset learngit
I am learning how to use git
Do you have any children
++<<<<<<< HEAD
+Where do you parents live
++=======
+ Going to the library
++>>>>>>> origin/master
samuel@learngit$ vim gitlearn.txt
samuel@learngit$
samuel@learngit$ git add gitlearn.txt
samuel@learngit$ git commit -m "modify gitlearn.txt"
[master dfd3be0] modify gitlearn.txt
samuel@learngit$ git push origin master
對象計數中: 6, 完成.
Delta compression using up to 4 threads.
壓縮對象中: 100% (6/6), 完成.
寫入對象中: 100% (6/6), 730 bytes | 0 bytes/s, 完成.
Total 6 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 1 local object.
To git@github.com:Franzzt/learngit.git
3c47049..dfd3be0 master -> master
samuel@learngit$