git branch //查看分支
git branch aming //建立分支
git checkout aming //切換到了aming分支下
再用git branch查看,會看到有兩個分支master和aming,當前使用的分支前面會有一個*在aming分支下 ,編輯2.txt,並提交到新分支
echo "askdfjlksadjflk" > 2.txt
git add 2.txt
git commit -m "laksjdflksjdklfj"
切換回master分支
git checkout master //此時cat 2.txt發現並無更改內容git
##本地分支建立--注意 這個是本地分支: [root@Dasoncheng gitroot]# git branch * master [root@Dasoncheng gitroot]# git branch aming [root@Dasoncheng gitroot]# git branch aming * master [root@Dasoncheng gitroot]# git checkout aming Switched to branch 'aming' [root@Dasoncheng gitroot]# git add . [root@Dasoncheng gitroot]# git commit -m "add branch aming" # On branch aming nothing to commit, working directory clean ##在分支aming上面建立文件aming.txt,到master分支查看: [root@Dasoncheng gitroot]# echo "aaaaaaaa" > aming.txt [root@Dasoncheng gitroot]# git add aming.txt [root@Dasoncheng gitroot]# git commit -m "add a file of aming.txt" 1 file changed, 1 insertion(+) create mode 100644 aming.txt [root@Dasoncheng gitroot]# ll total 12 -rw-r--r-- 1 root root 21 Nov 7 11:04 1.txt -rw-r--r-- 1 root root 15 Nov 7 16:36 2.txt -rw-r--r-- 1 root root 9 Nov 8 15:26 aming.txt [root@Dasoncheng gitroot]# git checkout master Switched to branch 'master' [root@Dasoncheng gitroot]# ll total 8 -rw-r--r-- 1 root root 21 Nov 7 11:04 1.txt -rw-r--r-- 1 root root 15 Nov 7 16:36 2.txt ##能夠看出,這兩個分支的文件是分開保存的(分支對文件的操做不受影響);下一部分咱們來合併分支!!
提問1:如何在github上面建立分支? --3裏面有詳細講解:
在本地新建一個分支: git branch Branch1
切換到你的新分支: git checkout Branch1
將新分支發佈在github上: git push origin Branch1
在本地刪除一個分支: git branch -d Branch1
提問2:如何建立本地分支呢?
[root@Dasoncheng learning]# git branch aming ##建立本地分支aming;
[root@Dasoncheng learning]# git branch
aming
*master
[root@Dasoncheng learning]# git checkout aming ##切換到分支aming;
Switched to branch 'aming'
[root@Dasoncheng learning]# git add .
[root@Dasoncheng learning]# git commit -m "add a new branch"
提交就能夠了;
其餘不懂的能夠:git branch --help 更多命令相似;github
git checkout master //合併分支以前,先切換到目標分支
git merge aming //把aming分支合併到了master
若是master分支和aming分支都對2.txt進行了編輯,當合並時會提示衝突,須要先解決衝突才能夠繼續合併。
解決衝突的方法是在master分支下,編輯2.txt,改成aming分支裏面2.txt的內容。 而後提交2.txt,再合併aming分支。
可是這樣有一個問題,萬一master分支更改的內容是咱們想要的呢? 能夠編輯2.txt內容,改成想要的,而後提交。切換到aming分支,而後合併master分支到aming分支便可(倒着合併)。合併分支有一個原則,那就是要把最新的分支合併到舊的分支。也就是說merge後面跟的分支名字必定是最新的分支。
git branch -d aming //刪除分支
若是分支沒有合併,刪除以前會提示,那就不合並,強制刪除
git branch -D amingvim
那麼問題就來了,若是咱們想aming和master兩個分支的文件同樣怎麼作(這個是一次性合併 不一樣分支修改相同文件,仍是不會影響)?咱們能夠合併分支!!
如今master和aming分支都有2.txt,但內容不同 咱們合併試試:緩存
[root@Dasoncheng gitroot]# git branch * aming master [root@Dasoncheng gitroot]# git checkout master Switched to branch 'master' [root@Dasoncheng gitroot]# git merge aming Updating 8d12096..8ebe1fa Fast-forward 2.txt | 2 -- 1 file changed, 2 deletions(-) [root@Dasoncheng gitroot]# ll total 8 -rw-r--r-- 1 root root 21 Nov 7 11:04 1.txt -rw-r--r-- 1 root root 4 Nov 8 16:15 2.txt [root@Dasoncheng gitroot]# cat 2.txt aaa ##合併成功;沒有報錯,2.txt內容是aming裏面的。 ##合併分支有一個原則,那就是要把最新的分支合併到舊的分支。也就是說merge後面跟的分支名字必定是最新的分支。 ##接下來咱們在兩個分支裏面 都修改2.txt並提交: [root@Dasoncheng gitroot]# git branch aming * master [root@Dasoncheng gitroot]# echo 'bbb' >> 2.txt [root@Dasoncheng gitroot]# git add 2.txt [root@Dasoncheng gitroot]# git commit -m "ch 2.txt" [master c1153a0] ch 2.txt 1 file changed, 1 insertion(+) [root@Dasoncheng gitroot]# git checkout aming Switched to branch 'aming' [root@Dasoncheng gitroot]# vim 2.txt [root@Dasoncheng gitroot]# echo 'ccc' >> 2.txt [root@Dasoncheng gitroot]# git add 2.txt [root@Dasoncheng gitroot]# git commit -m "ch 2.txt aming" [aming 3a53834] ch 2.txt aming 1 file changed, 1 insertion(+) [root@Dasoncheng gitroot]# git checkout master Switched to branch 'master' [root@Dasoncheng gitroot]# git merge aming ##將aming合併到master; Auto-merging 2.txt CONFLICT (content): Merge conflict in 2.txt Automatic merge failed; fix conflicts and then commit the result. [root@Dasoncheng gitroot]# cat 2.txt aaa <<<<<<< HEAD bbb ======= ccc >>>>>>> aming ##上面報錯了!咱們打開衝突文件2.txt 裏面記錄了 修改的信息;兩個文件不同 有衝突,那咱們如何合併 解決衝突呢? ##根據需求,查看那個分支下的2.txt是咱們須要的 將另外一個2.txt修改成咱們須要的內容,保持兩個文件的內容一致(即保證兩邊沒有衝突) 那麼合併就沒有問題了 [root@Dasoncheng gitroot]# git branch aming * master [root@Dasoncheng gitroot]# echo 'bbb' >> 2.txt ##master分支修改2.txt [root@Dasoncheng gitroot]# git add 2.txt [root@Dasoncheng gitroot]# git commit -m "ch 2.txt" [master c1153a0] ch 2.txt 1 file changed, 1 insertion(+) [root@Dasoncheng gitroot]# git checkout aming Switched to branch 'aming' [root@Dasoncheng gitroot]# vim 2.txt [root@Dasoncheng gitroot]# echo 'ccc' >> 2.txt ##aming分支修改2.txt [root@Dasoncheng gitroot]# git add 2.txt [root@Dasoncheng gitroot]# git commit -m "ch 2.txt aming" 1 file changed, 1 insertion(+) [root@Dasoncheng gitroot]# git checkout master Switched to branch 'master' [root@Dasoncheng gitroot]# git merge aming ##切換到master合併aming分支: Auto-merging 2.txt CONFLICT (content): Merge conflict in 2.txt Automatic merge failed; fix conflicts and then commit the result. ##合併報錯:指明2.txt有衝突;master的2.txt是我須要的 那麼我到aming裏面合併master便可!! [root@Dasoncheng gitroot]# cat 2.txt aaa <<<<<<< HEAD bbb ======= ccc >>>>>>> aming [root@Dasoncheng gitroot]# git checkout aming ##但這裏沒法切換aming,咱們先解決當前的問題; 2.txt: needs merge error: you need to resolve your current index first [root@Dasoncheng gitroot]# git status ##查看狀態究竟是怎麼回事? # On branch master # You have unmerged paths. # (fix conflicts and run "git commit") # # Unmerged paths: # (use "git add <file>..." to mark resolution) # # both modified: 2.txt # no changes added to commit (use "git add" and/or "git commit -a") [root@Dasoncheng gitroot]# git add 2.txt ##按照提示 咱們一步一步來: [root@Dasoncheng gitroot]# git commit -m "ch 2.txt" [root@Dasoncheng gitroot]# cat 2.txt aaa <<<<<<< HEAD bbb ======= ccc >>>>>>> aming [root@Dasoncheng gitroot]# vim 2.txt ##將master的2.txt修改成咱們須要的; [root@Dasoncheng gitroot]# git add 2.txt [root@Dasoncheng gitroot]# git commit -m "ch 2.txt" 1 file changed, 3 deletions(-) [root@Dasoncheng gitroot]# git checkout aming #切換到aming分支 進行反合併; Switched to branch 'aming' [root@Dasoncheng gitroot]# cat 2.txt aaa ccc [root@Dasoncheng gitroot]# git merge master Updating 3a53834..4d0e891 Fast-forward 2.txt | 1 + 1 file changed, 1 insertion(+) [root@Dasoncheng gitroot]# cat 2.txt aaa bbb ccc ##git branch -d 後面接分支名,刪除分支 -D強制刪除分支;更多git branch --help [root@Dasoncheng gitroot]# git branch -d aming Deleted branch aming (was 4d0e891). [root@Dasoncheng gitroot]# git branch * master
對於分支的應用,建議你們以這樣的原則來:
master分支是很是重要的,線上發佈代碼用這個分支,平時咱們開發代碼不要在這個分支上。
建立一個dev分支,專門用做開發,只有當發佈到線上以前,纔會把dev分支合併到master 開發人員應該在dev的基礎上再分支成我的分支,我的分支(在本身pc上)裏面開發代碼,而後合併到dev分支
dev分支合併bob分支的命令是:
git checkout dev //先切換到dev分支,而後
git merge bobbash
##github上面建立分支: [root@Dasoncheng learning]# git branch * master [root@Dasoncheng learning]# git branch aming [root@Dasoncheng learning]# git branch aming * master [root@Dasoncheng learning]# git checkout aming Switched to branch 'aming' [root@Dasoncheng learning]# git push origin aming Total 0 (delta 0), reused 0 (delta 0) To git@github.com:chengzhenge/learning.git * [new branch] aming -> aming [root@Dasoncheng learning]# ##在aming分支上面建立文件aming.txt推送以後,切換到master查看是否有aming 文件! [root@Dasoncheng learning]# ll total 12 -rw-r--r-- 1 root root 7 Nov 7 19:27 1.txt -rw-r--r-- 1 root root 6 Nov 7 19:28 2.txt -rw-r--r-- 1 root root 11 Nov 7 19:27 README.md [root@Dasoncheng learning]# echo 'aming' >aming.txt [root@Dasoncheng learning]# git add aming.txt [root@Dasoncheng learning]# git commit -m "add aming.txt" [root@Dasoncheng learning]# git push [root@Dasoncheng learning]# git checkout master Switched to branch 'master' [root@Dasoncheng learning]# ll total 12 -rw-r--r-- 1 root root 7 Nov 7 19:27 1.txt -rw-r--r-- 1 root root 6 Nov 7 19:28 2.txt -rw-r--r-- 1 root root 11 Nov 7 19:27 README.md
本地新建的分支若是不推送到遠程,對其餘人就是不可見的
查看遠程分支 git ls-remote origin,能夠看到全部分支**(或者git branch -a 這個更快--這個好像是緩存)**
對於git push分支分兩種狀況
1.當本地分支和遠程分支一致時: **
git push會把全部本地分支的變動一同推送到遠程,若是想只推送一個分支,使用git push origin branch-name
** 2.當本地分支比遠程分支多時:
默認git push 只推送本地和遠程一致的分支,想要把多出來的本地分支推送到遠程時,使用git push origin branch-name 若是推送失敗,先用git pull抓取遠程的新提交
git clone的時候默認只把master分支克隆下來,若是想把全部分支都克隆下來,須要手動建立,在本地建立和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱要一致.net
[root@Dasoncheng learning]# git ls-remote origin ##查看遠程全部分支; b817f6a6359d8facd1842f784aa46126cc174227 HEAD 72afdb29b294a971c041a90c72edf8ca7edd0805 refs/heads/aming b817f6a6359d8facd1842f784aa46126cc174227 refs/heads/dev b817f6a6359d8facd1842f784aa46126cc174227 refs/heads/master [root@Dasoncheng learning]# git branch -a ##也能夠查看遠程全部分支;--這個好像是緩存 dev * master remotes/origin/HEAD -> origin/master remotes/origin/aming remotes/origin/dev remotes/origin/master [root@Dasoncheng learning]# git branch aming * master [root@Dasoncheng learning]# git branch -d aming error: The branch 'aming' is not fully merged. If you are sure you want to delete it, run 'git branch -D aming'. [root@Dasoncheng learning]# git branch -D aming Deleted branch aming (was 72afdb2). [root@Dasoncheng learning]# git branch --help [root@Dasoncheng learning]# git checkout dev error: pathspec 'dev' did not match any file(s) known to git. [root@Dasoncheng learning]# git checkout -b dev Switched to a new branch 'dev' [root@Dasoncheng learning]# git branch * dev master
[root@Dasoncheng learning]# git branch * dev master [root@Dasoncheng learning]# ll total 12 -rw-r--r-- 1 root root 7 Nov 7 19:27 1.txt -rw-r--r-- 1 root root 6 Nov 7 19:28 2.txt -rw-r--r-- 1 root root 11 Nov 7 19:27 README.md [root@Dasoncheng learning]# echo aaa > a.txt [root@Dasoncheng learning]# git add a.txt [root@Dasoncheng learning]# git commit -m "add a.txt" create mode 100644 a.txt [root@Dasoncheng learning]# git checkout master Switched to branch 'master' [root@Dasoncheng learning]# echo bbb >b.txt [root@Dasoncheng learning]# git add b.txt [root@Dasoncheng learning]# git commit -m "add b.txt" create mode 100644 b.txt [root@Dasoncheng learning]# git push ##推送的時候,會將本地全部分支的改動推送到遠程; ##若是想只推送一個分支,使用git push origin branch-name b817f6a..787452d dev -> dev b817f6a..310883c master -> master
[root@Dasoncheng learning]# git branch dev3 ##建立一個遠程沒有的分支dev3 [root@Dasoncheng learning]# git branch dev dev3 * master [root@Dasoncheng learning]# git checkout dev3 Switched to branch 'dev3' [root@Dasoncheng learning]# echo ccc >c.txt [root@Dasoncheng learning]# git add c.txt [root@Dasoncheng learning]# git commit -m "add c.txt" create mode 100644 c.txt [root@Dasoncheng learning]# git push Everything up-to-date ##推送 ,提示全部的事物都是最新的 沒有變更;咱們能夠這樣git push origin dev3 [root@Dasoncheng learning]# git push origin dev3 * [new branch] dev3 -> dev3 ##推送成功; [root@Dasoncheng learning]#
提問:如何刪除遠程分支aming?
[root@Dasoncheng learning]# git branch -r -d origin/aming
Deleted remote branch origin/aming (was 72afdb2). ##此時,aming分支已經刪除
[root@Dasoncheng learning]# git branch -a
dev
*master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/master
[root@Dasoncheng learning]# git push origin :<aming>
-bash: syntax error near unexpected token `newline'
##推送一個本地空的分支到遠程 至關於刪除該分支;可是報錯了,我沒弄懂 上面的命令就能夠刪除aming分支了
##遠程看了一下,aming並無刪除 只是本地緩存刪了; 餓 個人天3d
[root@Dasoncheng ~]# cd /home/learning/ [root@Dasoncheng learning]# git branch ##通常都是針對master作tag aming2 dev dev3 * master [root@Dasoncheng learning]# git tag v1.0 ##對當前狀態打標籤v1.0 [root@Dasoncheng learning]# git tag ##查看當前分支 標籤信息; v1.0 [root@Dasoncheng learning]# git show v1.0 ##查看標籤詳細信息; commit efd8425d07fac286a39cd029211cc9e700e62594 Merge: b4d5d65 b91cd87 Author: chengzhenge <gecz0000@163.com> Date: Mon Nov 13 19:33:43 2017 +0800 Merge branch 'aming2' merge aming2 [root@Dasoncheng learning]# git log --pretty=oneline ##顯示歷史commit; efd8425d07fac286a39cd029211cc9e700e62594 Merge branch 'aming2' merge aming2 b91cd87fa3e04abadeb95809ee1485397418bb1a add aaa 69f094efff7cdb26d8db674764a43d370c7073b6 rm 1 b4d5d65c6f48a7d74315afa0b9abc2fcbe4620f8 Merge branch 'aming2' ffb285ea75f46da68f77119711672f17ccf6bd67 add bb 24dd4c31d23c4aea9fa7882a87f713787f3f31ef add aa …… [root@Dasoncheng learning]# git log --pretty=oneline --abbrev-commit ##簡化顯示歷史commit efd8425 Merge branch 'aming2' merge aming2 b91cd87 add aaa 69f094e rm 1 b4d5d65 Merge branch 'aming2' ffb285e add bb 24dd4c3 add aa …… [root@Dasoncheng learning]# git tag v0.9 ffb285e ##針對歷史commit打標籤 [root@Dasoncheng learning]# git tag -a v0.8 -m "tag history commit" 24dd4c3 ##針對commit打標籤並 備註: [root@Dasoncheng learning]# git push origin v1.0 ##推送指定標籤到遠程; Counting objects: 7, done. Delta compression using up to 2 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (4/4), 536 bytes | 0 bytes/s, done. Total 4 (delta 2), reused 0 (delta 0) remote: Resolving deltas: 100% (2/2), completed with 1 local object. To git@github.com:chengzhenge/learning.git * [new tag] v1.0 -> v1.0 [root@Dasoncheng learning]# git push --tags origin ##推送全部標籤到遠程; Counting objects: 1, done. Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done. Total 1 (delta 0), reused 0 (delta 0) To git@github.com:chengzhenge/learning.git * [new tag] v0.8 -> v0.8 [root@Dasoncheng learning]# git tag v0.8 v1.0 [root@Dasoncheng learning]# git show v0.8 ##tag history commit就是備註信息; tag v0.8 Tagger: chengzhenge <gecz0000@163.com> Date: Tue Nov 14 16:00:00 2017 +0800 tag history commit commit 24dd4c31d23c4aea9fa7882a87f713787f3f31ef Author: chengzhenge <gecz0000@163.com> Date: Mon Nov 13 19:29:18 2017 +0800 add aa diff --git a/aa.txt b/aa.txt new file mode 100644 index 0000000..8baef1b --- /dev/null +++ b/aa.txt @@ -0,0 +1 @@ +abc [root@Dasoncheng learning]# git tag v0.8 -d ##若是本地刪除tag,遠程須要刪除須要作一下操做: Deleted tag 'v0.8' (was 88b74f5) [root@Dasoncheng learning]# git push origin :refs/tag/v0.8 ##其實就是本地刪除,而後同步到遠程,即刪除; remote: warning: Deleting a non-existent ref. To git@github.com:chengzhenge/learning.git - [deleted] refs/tag/v0.8
[root@Dasoncheng learning]# git config --global alias.ct commit ##定義別名commit爲ct; [root@Dasoncheng learning]# ls 2.txt a aaa.txt aa.txt aming2.txt bb.txt b.txt README.md [root@Dasoncheng learning]# echo aaa > 1a.txt [root@Dasoncheng learning]# git add 1a.txt [root@Dasoncheng learning]# git ct -m "add 1a.txt" [master 8e7b931] add 1a.txt 1 file changed, 1 insertion(+) create mode 100644 1a.txt [root@Dasoncheng learning]# git config --global alias.br branch ##定義別名branch爲br; [root@Dasoncheng learning]# git br aming2 dev dev3 * master [root@Dasoncheng learning]# git config --list |grep alias ##查看alias別名列表; alias.ct=commit alias.br=branch [root@Dasoncheng learning]# git config --list ##查看全部信息; user.name=chengzhenge user.email=gecz0000@163.com alias.ct=commit alias.br=branch …… [root@Dasoncheng learning]# cat /root/.gitconfig ##這裏也能夠編輯alias,不過建議命令編輯; [user] name = chengzhenge email = gecz0000@163.com [alias] ct = commit br = branch [root@Dasoncheng learning]# git config --global --unset alias.br ##取消別名; [root@Dasoncheng learning]# git br git: 'br' is not a git command. See 'git --help'. Did you mean one of these? branch var [root@Dasoncheng learning]# cat /root/.gitconfig ##別名取消後,配置裏面也沒有了; [user] name = chengzhenge email = gecz0000@163.com [alias] ct = commit ##下面是git查詢log小技巧:彩色 有序顯示! [root@Dasoncheng learning]# 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" [root@Dasoncheng learning]# git lg * 8e7b931 - (HEAD, master) add 1a.txt (3 minutes ago) <chengzhenge> * efd8425 - (tag: v1.0) Merge branch 'aming2' merge aming2 (21 hours ago) <chengzhenge> |\ | * b91cd87 - (origin/aming2, aming2) add aaa (21 hours ago) <chengzhenge> | * 69f094e - rm 1 (21 hours ago) <chengzhenge> * | b4d5d65 - Merge branch 'aming2' (21 hours ago) <chengzhenge> |\ \ | |/ | * 24dd4c3 - add aa (21 hours ago) <chengzhenge> * | ffb285e - (origin/master, origin/HEAD) add bb (21 hours ago) <chengzhenge> * | 2b52bfb - test b.txt (21 hours ago) <chengzhenge> ……