本文主要記錄自己平時常常使用的git命令和搜集他人博客中1些經常使用命令,方便初學者理解和使用。
本文先簡單介紹git工作原理,然后詳細介紹git的各種使用方法。
1開始的時候,master分支是1條線,Git用master指向最新的提交,再用HEAD指向master,就可以肯定當前分支,和當前分支的提交點:
每次提交,master分支都會向前移動1步。
當我們創建新的分支,例如dev時,Git新建了1個指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev上:
Git創建1個分支很快,由于除增加1個dev指針,改改HEAD的指向,工作區的文件都沒有任何變化!
對工作區的修改和提交就是針對dev分支了,比如新提交1次后,dev指針往前移動1步,而master指針不變:
假設我們在dev上的工作完成了,就能夠把dev合并到master上。Git怎樣合并呢?最簡單的方法,就是直接把master指向dev確當條件交,就完成了合并:
所以Git合并分支也很快!就改改指針,工作區內容也不變!
合并完分支后,我們可以刪除dev分支。刪除dev分支就是把dev指針給刪掉,刪掉后,我們就剩下了1條master分支:
關于HEAD:
當前版本: HEAD
上1個版本: HEAD^,
上上1個版本: HEAD^^
之前100個版本: HEAD~100
準肯定位某次提交:commit_id
首先,我們在gitub上創建了自己的倉庫,然后需要把github上的代碼拉到本地。
第1次拉代碼,叫克隆clone。點擊“clone or download”,復制。如我的地址是 https://github.com/imutlxy/blog_code.git。
切換到你想放項目的目錄下,然后履行:
git clone 項目地址(如:https://github.com/imutlxy/blog_code.git)
就是把遠程分支的代碼checkout到本地
git checkout 分支名
條件條件:已clone了某個倉庫到本地,并且已檢出某個分支到本地,當該分支遠端分支更新時,我們可以通過git pull 來拉取最新代碼到本地。
git pull
//只顯示本地分支
git branch
//顯示本地和遠真個所有分支
git branch -a
結果以下:
帶*號的 master表示:當前位于master分支。
remotes/origin/master表示:遠端只有1個master分支。
帶remotes的都是遠端分支。
1般master是主分支,放著線上的代碼。我們開發1般用developer分支,所以,我們先來新建1個分支,并且把它推送到遠端。
在本地新建分支:
git branch 分支名(比如這里是 developers)
履行 git branch -a 查看1下有無建成功:
好了,已ok了,然后我們需要切換到developer分支上
git checkout developer
結果以下:
也能夠直接下面這條命令來實現創建分支并切換到該分支:
git checkout -b 新建分支名
git push origin developer
看結果,已有了1個remotes/origin/developer分支。
從這節開始就不上圖了,除非有必要。大家可以自己去敲驗證的命令。
如果你新建了1個分支還沒上傳到遠端,現在想刪除它。例如
git branch --delete 分支名(這里是test)
或
git branch -d 分支名
注意:如果當前分支還沒有被合并,刪除失敗,git會提示你。如果想強行刪除:
git branch -D 分支名
如果分支已推送到了遠端:
git push origin --delete 分支名(這里是test)
當我們修改了1些內容后,想提交到遠端,可以順次履行:
git status
git add .
git commit -m "注釋:表示此次提交是完成了哪些功能"
git push origin 分支名
下面逐一講授這些命令的含義和使用方法。
git status
以下圖,紅色的文件就是有改動的。BuildConfig.java,Manifest.java,R.java,這3個文件被刪除,delete,README.md和MainActivity.java被修改,modify。
git add命令主要用于把修改了的文件存到暫存區中。
添加1個文件到暫存區:(注意:需要進入到該文件所在的目錄)
git add 文件名
添加全部改動的文件到暫存區:
git add .
當添加完后,被添加的文件變成了綠色。用 git status就能夠看到,這里不貼圖。
git commit -m "注釋:表示這次提交甚么功能"
6.2我們將需要提交的文件添加到了索引庫中,然后我們需要將這些文件提交到本地倉庫。履行完 git commit 后,再用 git status 查看文件狀態,發現 git add 的那些文件都沒有了。
git push origin 分支名
如果這個分支是本地新建的,還沒有推送到遠端,用這個命令也能夠同時把本地分支提交到遠端,同時提交本地修改。
這時候候,你的所有改動就都push到遠端了,你可以在github上看到提交記錄。
上面我們在test分支上完成了功能,此時我們需要把test分支修改的東西合并到developer分支上。
我們先切換到developer分支:
git checkout developer
然后 再merge
git merge 分支名(這里是test)
此時,我們就看之條件交到test分支上的內容,在developer分支也能看到了。
如果沒有沖突,那固然是最好的,但很多時候merge時會有沖突,我們需要先解決沖突再合并。
比如:我現在在test分支上,README文件內容是這樣的:
然后我們修改成這樣:
此時我們順次履行
git add README.md
git commit -m "修改README"
git checkout developer
git merge test
看結果:
README出現conflict了,merge failed。
我們再來看看README內容:
吶,<<<<<<<指的是改動之前的內容,======作為分隔符,>>>>>>>指的是改動以后的內容。我們該解決沖突了,這里留下后面改動的,刪掉之前的內容。然后再將修改后的文件重新提交便可。
//查看當前分支的提交記錄
git log
//查看指定分支的提交記錄
git log 分支名
通常有些文件無需納入 Git 的管理,也不希望它們總出現在未跟蹤文件列表。通常都是些自動生成的文件,比如日志文件,或編譯進程中創建的臨時文件等。我們可以創建1個名為 .gitignore 的文件,列出要疏忽的文件模式。android studio創建project時會自動生成1個.gitignore 的文件。
查看疏忽文件:
cat .gitignore
以下圖:
我們可以自己編輯 gitignore 文件,添加別的需要疏忽的文件。
場景1:
我修改了README.md文件,但是還沒有履行 git add,此時,我不想要這些修改了,我要放棄這些修改,也就是回到之前沒有任何修改的狀態。
//放棄單個文件
git checkout 文件名
//放棄全部修改
git checkout .
場景2:
接著上面的問題,如果我已把這些修改的文件都添加到了暫存區中,也就是我履行了git add,但還沒履行 git commit,這時候如果想撤消這些修改,重新放回工作區,可以履行:
//撤消某個文件
git reset HEAD 文件名
//撤消全部文件,全部放回工作區
git reset HEAD
如果完全不想要這些暫存區中的文件,也就是撤消此次所有修改,并且不放回工作區,可以履行:
git reset –hard
場景3:
我修改了文件,然后順次履行了 git add ,git commit,但我還沒履行 git push,此時我發現自己提交錯了文件,我想撤消此次提交,回到上次提交的狀態。可以履行:
git reset --hard HEAD^
我們來實際摹擬1下場景。
再看1下提交記錄:
看到了嗎,之前的提交居然消失了!README內容也回到之前的模樣。
如果你又想再回到剛才撤消記錄的狀態,怎樣辦?
git reset –hard 剛才提交記錄的版本號(這里是1883cb1df1bd670088e1cf82de18967076d1754f).到這里大家可能會問,怎樣拿到這個記錄的版本號呢?
git reflog
看到沒,git會記錄你的每次記錄!在git,是有后悔藥的!!!
git diff master..test
會詳細列出修改內容
git diff
顯示你當前的索引和上次提交間的差異(這次git add 和 上次git commit的差異),也是下次提交時要提交的內容(staged,添加到索引中):
git diff --cached
//可以具體定位到某1個文件
git diff --cached filename
git diff 指定分支名
//也以加上路徑限定符,來只 比較某1個文件或目錄。
git diff HEAD -- ./lib
如果不是查看每一個文件的詳細差別,而是統計1下有哪些文件被改動,有多少行被改動,就能夠使用‘–stat’ 參數。
git diff --stat
以下圖,BuildConfig.java,Manifest.java,R.java,README.md,MainActivity.java這幾個文件被改動。
git diff 版本號1 版本號2
git diff 版本號1:filename 版本號2:filename
當你在本地新建了1個倉庫,可以通過以下命令把它變成git管理倉庫:
git init
參考:
廖雪峰:Git教程
Git
Git Community Book 中文版
上一篇 iOS 常用公共方法
下一篇 C#學習篇(一)泛型