開發人員資訊註冊
git config user.name “zhangle”
git config user.email zhangle@eastaeon.com
Ex:Author部分顯示了提交者資訊
全域配置: git config --global user.name "xxx" 三種下載方法:
1.git 協議git clone git://192.168.110.230/庫名稱
2.http協議git clone http://192.168.110.230/gitweb/庫名稱
3.SSH協議 git clone username@192.168.110.230:/home/git/庫名稱
以下git 官方文檔截圖
例如:
git clone ssh://git@192.168.0.242/~/gitweb/ALPS.L0.MP2.V1_AEON6582_WT_L_INHOUSE
git clone ssh://git@192.168.0.242/github/ALPS.L0.P45.2_K35V1_64_OP01_PRE_INHOUSE 下載步驟:
1.先下載基礎版本在checkout
git clone ssh://git@192.168.0.22/home/git/<版本庫名稱>
紅色部分在於同一git伺服器都是相同的。
<版本庫名稱>.git 代表項目在伺服器上的版本庫命名。
2.直接擷取
git clone ssh://git@192.168.0.119/home/git/ALPS.ICS.MP.V2.19 -b Android_Malata_K509-I10_Thailand Android_Malata_K509-I10_Thailand
擷取開發branch最新代碼
git clone完之後擷取到的代碼是伺服器上版本庫當前的branch,
查詢當前branch的方法:git branch
Ex:加*代表的就是當前所在branch
git branch 經常用到的參數還有:
1.git branch –a 顯示全部branch,包括遠程和本地
2.git branch –r 只顯示遠程branch
如果想切換到其他branch,比如我們想切刀基礎版本branch工作,在伺服器上branch k50xv4是基礎版本的branch,所以使用:
git checkout –b k50xv4 origin/ k50xv4
origin/ k50xv4 代表上圖紅色字型的遠程分支
checkout成功後會得到一個和伺服器上branch k50xv4一樣的本地branch k50xv4。
git checkout BRANCHNAME
建立一個新分支
git branch newbranchname 建立完並沒有立即切換到這個分支,要使用
git checkout newbranchname 切換新分支,不存在時就先建立再切換到新分支
恢複工作區某個檔案修改
git checkout <path> vi常用命令(處理merge 衝突時用):
dd //刪除(但是必須要連按2個d)
u //回退,也就是如果用了dd之後就可以用u來回複
n //查看下一個
: //按這個:之後才可以輸入字元,如x
x //在按了:之後再按x就表示儲存當前修改儲存修改完成的衝突
vi //vi的後面加該修改的檔案名稱就表示要修改這個檔案了,比如刪除檔案衝突
Ctrl+r 恢複上一步被撤銷的操作
解決衝突
git reset --hard HEAD //恢複到當前分支最後提交的那個commit的狀態
git fetch
git merge origin/Driver_YOULITONG_K502-PM910//merge
git branch --no-merged //看看哪些檔案沒有合并成功
git status > status.info //將當前的狀態資訊匯入到status.info檔案中(搜尋unmerged)
less status.info 或者 more status.info //查看status.info檔案中的資訊
vi mediatek/config/ztenj75_sz_cu_ics/ProjectConfig.mk //查看編輯解決衝突,/HEAD斷行符號 查看衝突,下一處 n, 刪除一行dd,儲存退出 :x,不儲存退出 :q!
git add mediatek/config/ztenj75_sz_cu_ics/ProjectConfig.mk //上傳衝突檔案
git commit -m "fix meger" //提交
git merge origin/Driver_YOULITONG_K502-PM910 //再次merge
git whatchanged//查看修改記錄
git push origin Android_HK_K501_77-W916:Android_HK_K501_77-W91
// 把本地修改提交到遠程伺服器上面去
git push
$ git push origin test:master
// 提交本地test分支作為遠端master分支
$ git push origin test:test
// 提交本地test分支作為遠端test分支
如果想刪除遠端分支呢。類似於上面,如果:左邊的分支為空白,那麼將刪除:右邊的遠端分支。
$ git push origin :test
// 剛提交到遠端test將被刪除,但是本地還會儲存的,不用擔心。
舉個例子:
git push origin :origin/Android_HK_K501_77-W916
//由於:前面為空白所以本來在伺服器上面存在的分支origin/Android_HK_K501_77-W916和Android_HK_K501_77-W916現在就只有一個了,因為分支origin/Android_HK_K501_77-W916被刪除了,但是本地的還在
常見錯誤: 1.error:failed to push some refs to ...
當要push代碼到git時,出現提示:
|
error:failed to push some refs to ...
Dealing with “non-fast-forward” errors
From time to time you may encounter this error while pushing:
$ git push origin master
To ../remote/
! [rejected] master -> master (non-fast forward)
error: failed to push some refs to '../remote/'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again. See the 'non-fast forward'
section of 'git push --help' for details. |
這種情況通常由以下的原因產生:
你可以強制git-push在上傳修改時先更新,只要在分支名前面加一個加號。
- 用 `git-reset --hard` 刪除了一個已經發布了的一個提交,或是
- 用 `git-commit --amend` 去替換一個已經發布的提交,或是
- 用 `git-rebase` 去rebase一個已經發布的提交.
$ git push ssh://yourserver.com/~you/proj.git +master
解決方案:
方法1.強推,即利用強覆蓋方式用你本地的代碼替代git倉庫內的內容
git push -f
方法2. 先把git的東西fetch到你本地然後merge後再push
$ git fetch
$ git merge
這2句命令等價於
$ git pull
可是,這時候又出現了如下的問題:
上面出現的 [branch "master"]是需要明確(.git/config)如下的內容
|
[branch "master"]
remote = origin
merge = refs/heads/master |
這等於告訴git2件事:
1,當你處於master branch, 預設的remote就是origin。
2,當你在master branch上使用git pull時,沒有指定remote和branch,那麼git就會採用預設的remote(也就是origin)來merge在master branch上所有的改變
如果不想或者不會編輯config檔案的話,可以在bush上輸入如下命令列:
$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master
之後再重新git pull下。最後git push你的代碼吧。
2. error: dst refspec Android_T600_liandai_S28A_W1_98M matches more than one.
error: failed to push some refs to 'ssh://git@192.168.0.119/home/git/ALPS.JB2.MP.V1.3'
出現這個問題的原因是本地的tag和分支名稱相同,或者遠程有和分支名稱一樣的tag,要刪除本地和遠程與要提交的分支名稱相同的tag,才能繼續push.
git tag –d 刪除本地和分支名稱相同的tag
git push origin :refs/tags/[tag名稱] 刪除遠程tag
3. Git – fatal: Unable to create ‘/path/my_project/.git/index.lock’: File exists.
fatal: Unable to create ‘/path/my_proj/.git/index.lock’: File exists.
If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.
可以試著刪除 index.lock
rm -f ./.git/index.lock
4.error: src refspec XXX matches more than one
在用repo管理代碼時遇到了error: src refspec XXX matches more than one 這樣的錯誤,一個是在刪除一個遠端tag時遇到的,
一個是在將一個tag push到伺服器時遇到的,兩個錯誤的提示是完全一樣的。遇到這樣的問題該怎麼解決,經過研究後找到了
解決的方法,下面就將解決的方法和大家分享。
第一種情況,刪除遠程branch時遇到這種情況的解決方案:
比如刪除伺服器上的testtag 這個tag時,輸入如下命令
git push origin :testtag
提示 error: src refspec XXX matches more than one
error: failed to push some refs to 'git@xxx:android/text.git'
出現這個錯誤的原因是在伺服器上有個tag的分支是testtag這個名有個branch的分支也是這個名,
也就是說tag分支和branch分支同名了,在執行 git push origin :testtag這個命令時不知道是刪除那個
所以會提示錯誤。解決辦法:
git push origin :refs/tags/testtag
這就是明確告訴伺服器刪除的tag的分支,
刪除branch分支
git push origin :refs/heads/testtag
第二種情況,將一個tag分支push到伺服器時遇到這種情況的解決方案:
還那testtag這個tag分支為例,將tag分支push到伺服器
git push origin testtag
提示: error: src refspec XXX matches more than one
error: failed to push some refs to 'git@xxx:android/text.git'
出現這個錯誤主要是因為本地也有個branch的分支名為testtag,這樣在push時不知道是將branch的分支push到
伺服器還是將tag的分支push到伺服器,如果是將tag分支push到伺服器,那就將branch的分支刪掉,如果是將
branch的分支push到伺服器就將tag的分支刪掉。
刪除branch分支的方法:
git branch -D testtag
刪除tag分支的方法:
git tag -d testtag git 開發人員日常基本操作
(1)將本地代碼與伺服器同步命令:git pull origin 分支名稱 (我們目前的分支名稱為br_dev)
(2)修改需要修改的檔案,修改完畢查看當前修改的檔案命令為:git status
(3)將修改的檔案添加到版本樹:
a.單個檔案 git add filename
b.添加工作目錄下的所有檔案 git add –A
(4)提交代碼到本地版本庫 git commit –m “commit comment”,
如果注釋比較長也可以用以下命令:git commit 斷行符號,在彈出的介面中輸入你的注釋,書寫完畢後按ctrl+X 然後按YES 儲存修改即可
如果不小心寫錯了注釋用一下命令修改最近的提交注釋 git commit -amend
(5)注釋寫完後就需要將自己的修改打成patch發給代碼提交人員
打patch的命令為:git format-patch origin 將目前的修改打成patch。
如果想只將一個提交打成patch則命令為:git format-patch -1 commintid提交號
(6)將本地程式碼推送到遠程版本庫 git push origin master
origin 是代碼的源可以自己添加預設的名稱為origin
master 是遠程版本庫的分支名稱,可以根據實際情況寫上分支名稱,預設為master git branch 分支操作
(1)建立分支 git branch branchname
以某個分支為基礎建立新的分支 git branch newbranch oldbranch
以某個tag為基準建立分支:git branch branchname tagname
(2)刪除分支
git branch –d branchname
//git branch -d只能刪除那些已經被當前分支的合并的分支. 如果你要強制移除某個分支的話就用git branch –D
刪除遠程分支:git push origin :遠程分支名稱。
(3)切換分支
git checkout branchname
//切換到本地的分支,branchname 為本地分支名稱.
git checkout –b k50xv4 origin/ k50xv4
//以遠程分支k50xv4為基礎建立一個本地分支
(4)分支合并
git merge 需要合并的分支名稱 –squash
此參數表示將另一條分支的所有提交合并為當前分支上的一個提交,然後git commit –m “commit comment ”
合并分支但是不提交:git merge --no-commit branchname
揀選合并 cherry-pick
git checkout master
git cherry-pick 其他分支的提交版本號碼
(5)分支重新命名
Git branch –m oldbranchname newbranchname
git checkout
主要功能就是遷出一個分支的特定版本。預設是遷出分支的HEAD版本
樣本:
git checkout master //取出master版本的head。
git checkout tag_name //在當前分支上 取出 tag_name 的版本
git checkout master file_name //放棄當前對檔案file_name的修改
git checkout commit_id file_name //取檔案file_name的 在commit_id是的版本。commit_id為 git commit 時的sha值。
$ git checkout -- hello.rb
這條命令把hello.rb從HEAD中籤出.
$ git checkout .
這條命令把 目前的目錄所有修改的檔案 從HEAD中籤出並且把它恢複成未修改時的樣子.
注意:在使用git checkout 時,如果其對應的檔案被修改過,那麼該修改會被覆蓋掉。
git log日誌
查看日誌:git whatchanged
git show HEAD //顯示當前分支的最新版本的更新細節 //git show HEAD^^等
退出看日誌:ctrl + z 或者q
git show commitid //顯示某一個修改的具體細節
git log 協助
參數說明:
-n (n是一個正整數),查看最近n次的提交資訊
-- fileName fileName為任意檔案名稱,查看指定檔案的提交資訊。(註:檔案名稱應該放到參數的最後位置,通常在前面加上--並用空格隔開表示是檔案。)
$ git log file1 file2 查看file1檔案file2檔案的提交記錄$ git log file/ 查看file檔案夾下所有檔案的提交記錄 |
--branchName branchName為任意一個分支名字,查看莫個分支上的提交記錄。同上,需要放到參數中的最後位置處。(註:如果分支名與檔案名稱相同,系統會提示錯誤,可通過--選項來指定給定的參數是分支名還是檔案名稱。)例:在當前分支中有一個名為v1的檔案,同時還存在一個名為v1的分支,則:
$ git log v1 -- 此時的v1代表的是分支名字$ git log -- v1 此時的v1代表的是名為v1的檔案$ git log v1 -- v1 |
tagName或branchame 查詢指定標籤/分支中的提交記錄資訊
$ git log v1.0.. 查詢從v1.0以後的提交記錄(不包含v1.0)$ git log test..master 查詢master分支中的提交記錄但不包含test分支記錄$ git log master..test 查詢test分支中的提交記錄但不辦含master分支記錄$ git log master...test 查詢master或test分支中的提交記錄。$ git log test --not master 屏蔽master分支 |
根據commit查詢日誌
$ git log commit 查詢commit之前的記錄,包含commit$ git log commit1 commit2 查詢commit1與commit2之間的記錄,包括commit1和commit2$ git log commit1..commit2 同上,但是不包括commit1 |
其中,commit可以是提交雜湊值的簡寫入模式,也可以使用HEAD代替。HEAD代表最後一次提交,HEAD^為最後一個提交的父提交,等同於HEAD~1,HEAD~2代表倒數第二次提交
--pretty 按指定格式顯示日誌資訊,可選項有:oneline,short,medium,full,fuller,email,raw以及format:<string>,預設為medium,可以通過修改設定檔來指定預設的
方式。
$ git log (--pretty=)oneline |
常見的format選項:
|
選項 說明
%H 提交對象(commit)的完整雜湊字串
%h 提交對象的簡短雜湊字串
%T 樹對象(tree)的完整雜湊字串
%t 樹對象的簡短雜湊字串
%P 父物件(parent)的完整雜湊字串
%p 父物件的簡短雜湊字串
%an 作者(author)的名字
%ae 作者的電子郵件地址
%ad 作者修訂日期(可以用 -date= 選項定製格式)
%ar 作者修訂日期,按多久以前的方式顯示
%cn 提交者(committer)的名字
%ce 提交者的電子郵件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式顯示
%s 提交說明 |
註:作者是指最後一次修改檔案的人;而提交者是指提交該檔案的人。
$ git log --pretty=format:"%an %ae %ad %cn %ce %cd %cr %s" --graph |
--mergs 查看所有合并過的提交記錄
--no-merges查看所有未被合并過的提交資訊
--author=someonet查詢指定作者的提交記錄
$ git log --author=gbyukg |
--since,--affter 僅顯示指定時間之後的提交(不包含當前日期)
--until,--before僅顯示指定時間之前的提交(包含當前日期)
$ git log --before={3,weeks,ago} --after={2010-04-18} |
--grep 通過提交說明資訊過濾提交日誌
$ git log --grep=hotfix 該命令會列出所有包含hotfix字樣的提交資訊說明的提交記錄 |
注意:如果想同時使用--grep和--author,必須在附加一個--all-match參數。
-S通過查詢檔案的變更內容來檢索出指定提交日誌 註:-S後沒有"=",與查詢內容之間也沒有空格符
-p查看提交時的補丁資訊
$ git log -p --no-merges -2 |
--stat 列出檔案的修改行數
--sortstat 只顯示--stat中最後行數修改添加移除的統計
--graph 以簡單的圖形方式列出提交記錄
--abbrev-commit 僅顯示 SHA-1 的前幾個字元,而非所有的 40 個字元。
--relative-date 使用較短的相對時間顯示(比如,“2 weeks ago”)。
--name-only 僅在提交資訊後顯示已修改的檔案清單。
--name-status 顯示新增、修改、刪除的檔案清單。
GIT Blame
用來查看檔案的每個部分修改詳情
例子:
git log -2 -p 顯示最近兩次commit的log 和 diff
git log -p 查看曆次的log詳細修改資訊及更改情況