git基本使用

來源:互聯網
上載者:User

  開發人員資訊註冊

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次的提交資訊

$ git log -2    查看最近2次的提交記錄

-- 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後沒有"=",與查詢內容之間也沒有空格符

$ git log --Snew

-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 blame index.php

 

例子:

git log -2 -p   顯示最近兩次commit的log 和 diff

git log -p    查看曆次的log詳細修改資訊及更改情況

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.