Git常用指令及問題解決

Git是有中文版的使用手冊的https://git-scm.com/book/zh/v2

新公司進去全部用的Git,不過對於我來說,很快就熟悉了,包括一些工作流,分支等等

期間還學習了廖雪峯的Git

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

 

 

Git基礎知識點

本地Git的三種狀態

已提交(committed)、已修改(modified)和已暫存(staged)

 已提交表示數據已經安全的保存在本地數據庫中,也就是,Git目錄裏面。 已修改表示修改了文件,但還沒保存到數據庫中, 此時分爲兩種,一種是沒有執行add命令,數據在工作目錄, 一種是已暫存表示對一個已修改文件的當前版本做了標記,使之包含在下次提交的快照中,此時數據是在暫存區

 

 

基礎的命令可以參考文檔,現在記錄一些乾貨

初始化倉庫

git init

Git相關配置

# 安裝完Git後第一件要做的事,設置用戶信息(global可換成local在單獨項目生效):
git config --global user.name "用戶名" # 設置用戶名
git config --global user.email "用戶郵箱"   #設置郵箱
git config --global user.name   # 查看用戶名是否配置成功
git config --global user.email   # 查看郵箱是否配置

# 其他查看配置相關
git config --global --list  # 查看全局設置相關參數列表
git config --local --list # 查看本地設置相關參數列表
git config --system --list # 查看系統配置參數列表
git config --list  # 查看所有Git的配置(全局+本地+系統)
git config --global color.ui true //顯示git相關顏色

將文件添加到倉庫

git add 文件名 # 將工作區的某個文件添加到暫存區   
git add -u # 添加所有被tracked文件中被修改或刪除的文件信息到暫存區,不處理untracked的文件
git add -A # 添加所有被tracked文件中被修改或刪除的文件信息到暫存區,包括untracked的文件
git add . # 將當前工作區的所有文件都加入暫存區
git add -i # 進入交互界面模式,按需添加文件到緩存區

將暫存區文件提交到本地倉庫

git commit -m "提交說明" # 將暫存區內容提交到本地倉庫
git commit -a -m "提交說明" # 跳過緩存區操作,直接把工作區內容提交到本地倉庫

查看倉庫當前狀態

git status

比較文件異同

git diff # 工作區與暫存區的差異
git diff 分支名 #工作區與某分支的差異,遠程分支這樣寫:remotes/origin/分支名
git diff HEAD  # 工作區與HEAD指針指向的內容差異
git diff 提交id 文件路徑 # 工作區某文件當前版本與歷史版本的差異
git diff --stage # 工作區文件與上次提交的差異(1.6 版本前用 --cached)
git diff 版本TAG # 查看從某個版本後都改動內容
git diff 分支A 分支B # 比較從分支A和分支B的差異(也支持比較兩個TAG)
git diff 分支A...分支B # 比較兩分支在分開後各自的改動

# 另外:如果只想統計哪些文件被改動,多少行被改動,可以添加 --stat 參數

查看歷史記錄

git log # 查看所有commit記錄(SHA-A校驗和,作者名稱,郵箱,提交時間,提交說明)
git log -p -次數 # 查看最近多少次的提交記錄
git log --stat # 簡略顯示每次提交的內容更改
git log --name-only # 僅顯示已修改的文件清單
git log --name-status # 顯示新增,修改,刪除的文件清單
git log --oneline # 讓提交記錄以精簡的一行輸出
git log –graph –all --online # 圖形展示分支的合併歷史
git log --author=作者  # 查詢作者的提交記錄(和grep同時使用要加一個--all--match參數)
git log --grep=過濾信息 # 列出提交信息中包含過濾信息的提交記錄
git log -S查詢內容 # 和--grep類似,S和查詢內容間沒有空格
git log fileName # 查看某文件的修改記錄,找背鍋專用

從遠程倉庫克隆項目到本地

git clone [email protected]:git帳號名/倉庫名.git

代碼回滾

git reset HEAD^ # 恢復成上次提交的版本
git reset HEAD^^ # 恢復成上上次提交的版本,就是多個^,以此類推或用~次數

git reflog

git reset --hard 版本號

--soft:只是改變HEAD指針指向,緩存區和工作區不變;
--mixed:修改HEAD指針指向,暫存區內容丟失,工作區不變;
--hard:修改HEAD指針指向,暫存區內容丟失,工作區恢復以前狀態;

那麼如何將已經push到遠程倉庫的記錄刪除掉呢?
參考:https://blog.csdn.net/hanchao5272/article/details/79435730

1.撤銷提交信息
首先,通過git log查看提交信息,以便獲取需要回退至的版本號:

$ git log
commit a44822002522f2ab1e3a5e2a1cec00a7d3d02185 (HEAD -> master, origin/master, origin/HEAD)
Author: hanchao5272 <[email protected]>
Date:   Sun Mar 4 11:14:55 2018 +0800

    CSDN-java反射06-成員變量Field-代碼優化

commit aa909cff2239536df14820fe086d96305b24e9f1
Author: hanchao5272 <[email protected]>
Date:   Sat Mar 3 23:43:03 2018 +0800

    CSDN-java反射-修飾符-代碼優化


我們需要撤銷CSDN-java反射06-成員變量Field-代碼優化這次提交,所以需要回退至的版本是CSDN-java反射-修飾符-代碼優化,即需要回退至的版本號是:aa909cff2239536df14820fe086d96305b24e9f1。

然後,通過git reset –soft <版本號>重置至指定版本的提交,達到撤銷提交的目的:

$ git reset --soft aa909cff2239536df14820fe086d96305b24e9f1

參數soft指的是:保留當前工作區,以便重新提交 
還可以選擇參數hard,會撤銷相應工作區的修改,一定要謹慎使用

然後,通過git log確認是否成功撤銷:

$ git log
commit aa909cff2239536df14820fe086d96305b24e9f1 (HEAD -> master)
Author: hanchao5272 <[email protected]>
Date:   Sat Mar 3 23:43:03 2018 +0800

    CSDN-java反射-修飾符-代碼優化

已經成功撤銷,本地是看不到了,但是遠程還是存在記錄的。

2.撤銷
通過git push origin master –force強制提交當前版本號,以達到撤銷版本號的目的:

$ git push origin  master --force
Total 0 (delta 0), reused 0 (delta 0)
To github.com:hanchao5272/myreflect.git
 + a448220...aa909cf master -> master (forced update)
--------------------- 

同步遠程倉庫

git push -u origin master

刪除版本庫文件

git rm 文件名

 

本地倉庫內容推送到遠程倉庫

git remote add origin [email protected]:帳號名/倉庫名.git

創建分支

git checkout -b dev
-b表示創建並切換分支
上面一條命令相當於一面的二條:
git branch dev //創建分支
git checkout dev //切換分支

查看分支

git branch

合併分支

git merge dev
//用於合併指定分支到當前分支

git merge --no-ff -m "merge with no-ff" dev
//加上--no-ff參數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併

刪除分支

刪除本地分支:git branch -d <name>

刪除遠程分支: git push origin --delete <name>

查看分支合併圖

git log --graph --pretty=oneline --abbrev-commit

查看遠程庫信息

git remote
// -v 顯示更詳細的信息

撤消某次提交

git revert HEAD # 撤銷最近的一個提交
git revert 版本號 # 撤銷某次commit

拉取遠程分支到本地倉庫

git checkout -b 本地分支 遠程分支 # 會在本地新建分支,並自動切換到該分支
git fetch origin 遠程分支:本地分支 # 會在本地新建分支,但不會自動切換,還需checkout
git branch --set-upstream 本地分支 遠程分支 # 建立本地分支與遠程分支的鏈接

同步遠程倉庫更新

git fetch  origin master
 //從遠程獲取最新的到本地,首先從遠程的origin的master主分支下載最新的版本到origin/master分支上,然後比較本地的master分支和origin/master分支的差別,最後進行合併。

git fetch比git pull更加安全

Git操作之克隆某一個特定的遠程分支

git clone -b <branch name> [remote repository address]

例如:git clone -b dev_xq https://github.com/yq2yizi/GitLearn.git

 

並行開發,開分支有兩種方式:

  • 一種是在遠程開好分支,本地直接拉下來;
  • 一種是本地開好分支,推送到遠程.

1 遠程先開好分支然後拉到本地

方案1(同名):git checkout --track origin/branch_name

方案2(可以不同名):git checkout -b new_branch_name branch_name

跟蹤遠程分支

1)如果遠程新建了一個分支,本地沒有該分支,可以利用 git checkout --track origin/branch_name ,這時本地會新建一個分支名叫 branch_name ,會自動跟蹤遠程的同名分支 branch_name。

 

2)用上面 1) 中方法,得到的分支名永遠和遠程的分支名一樣,如果想新建一個本地分支不同名字,同時跟蹤一個遠程分支可以利用:

git checkout -b new_branch_name branch_name

這條指令本來是根據一個 branch_name 分支分出一個本地分支 new_branch_name,但是如果所根據的分支 branch_name 是一個遠程分支名,那麼本地的分支會自動的 track 遠程分支。建議跟蹤分支和被跟蹤遠程分支同名

2 本地先開好分支然後推送到遠程

方案1:每次pull和push需要指定分支名字

創建並切換到分支feature-branch

git checkout -b feature-branch 

推送本地的feature-branch(冒號前面的)分支到遠程origin的feature-branch(冒號後面的)分支(沒有會自動創建)

git push origin feature-branch:feature-branch 

方案2:不需要指定名字

git push --set-upstream origin branch_name

如果本地新建了一個分支 branch_name,但是在遠程沒有,這時候 push 和 pull 指令就無法確定該跟蹤誰,一般來說我們都會使其跟蹤遠程同名分支,所以可以利用 git push --set-upstream origin branch_name ,這樣就可以自動在遠程創建一個 branch_name 分支,然後本地分支會 track 該分支。後面再對該分支使用 push 和 pull 就自動同步。無需再指定分支。

 

Git修改分支名稱

本地分支重命名

git branch -m oldbranchname newbranchname

遠程分支重命名

如果修改遠程分支,只需要將本地分支重命名爲新分支名稱,然後刪除遠程分支,再把本地分支上傳就可以了

 

解決Git在添加ignore文件之前就提交了項目無法再過濾問題

由於未添加ignore文件造成提交的項目很大(包含生成的二進制文件)。所以我們可以將編譯生成的文件進行過濾,避免添加到版本庫中了。

首先爲避免衝突需要先同步下遠程倉庫

git pull

在本地項目目錄下刪除緩存

git rm -r --cached .

新建.gitignore文件

在項目的根目錄下面新建.gitignore文件並添加相應的過濾規則

再次add所有文件

輸入以下命令,再次將項目中所有文件添加到本地倉庫緩存中

git add .

再次添加commit

這次commit是爲了說明添加ignore文件的。

git commit -m "add ignore"

最後提交到遠程倉庫即可

git push

同時注意 .gitignore只能忽略那些原來沒有被track的文件,如果某些文件已經被納入了版本管理中,則修改.gitignore是無效的。

如果要動態忽略文件,可以使用以下命令

git update-index --assume-unchanged PATH    在PATH處輸入要忽略的文件。

 

29 標籤

爲什麼需要標籤,因爲工作中會基於工作的進程去打一個標籤,作爲一個節點,以後基於此標籤開發

 

1 記住:標籤是基於commit來打的

git tag <name>就可以打一個新標籤:

git tag查看所有標籤

git log --pretty=oneline --abbrev-commit

git show <tagname>查看標籤信息

git tag -a v0.1 -m "version 0.1 released" 1094adb

用-a指定標籤名,-m指定說明文字:

標籤命令

git tag 標籤 //打標籤命令,默認爲HEAD
git tag //顯示所有標籤
git tag 標籤 �版本號 //給某個commit版本添加標籤
git show 標籤 //顯示某個標籤的詳細信息

2 打印符合檢索條件的標籤

git tag -l <版本號>

如 git tag -l 1.*.* 爲搜索一級版本爲1的版本

 

3 查看對應標籤狀態

git checkout <版本號>

 

4 創建輕量標籤

輕量標籤指向一個發行版的分支,其只是一個像某commit的引用,不存儲名稱時間戳及標籤說明等信息。定義方法如下

git tag <版本號>-light

 

5 刪除本地標籤

git tag -d <版本號>

 

6 推送所有標籤

git push origin --tags

 

7 推送指定版本的標籤

git push origin <版本號>

 

8 刪除遠程倉庫的標籤

git push origin :refs/tags/<版本號>

9 新版本Git (> v1.7.0)

git push origin --delete <版本號>

 

30 當我們合併分支或者是pull的時候會碰到這個問題:Please enter a commit message to explain why this merge is necessary.

請輸入提交消息來解釋爲什麼這種合併是必要的

git 在pull或者合併分支的時候有時會遇到這個界面。可以不管(直接下面3,4步),如果要輸入解釋的話就需要:

1.按鍵盤字母 i 進入insert模式

2.修改最上面那行黃色合併信息,可以不修改

3.按鍵盤左上角"Esc"

4.輸入":wq",注意是冒號+wq,按回車鍵即可

 

31 git操作及fatal: Authentication failed for錯誤解決

git pull
fatal: Authentication failed for 'https://gitee.com/lxxxx/xxMCUproject.git/'

解決方法:

git config --system --unset credential.helper

git config --global user.name "xxx"
git config --global user.email "[email protected]"

 

32 最後是工作流的講解

不同公司有不同的工作流,以上只是大致思路

 

33 公司倉庫更改地址後無法提交代碼和獲取最新代碼

  1. 本地 Git 倉庫根目錄下: .git ;

  2. 編輯 Git 配置文件裏面的url地址,將地址的別名改成公司最新的倉庫地址

  3. 如果沒有權限或者需要生成新的ssh文件,則刪除遠程倉庫的ssh key,然後本地生成配置到遠程倉庫的ssh key即可(不要用android stuido自帶的工具去拉取和提交,用命令行可以清晰的看到報警和錯誤信息!)

參考:

如何快速關聯/ 修改 Git 遠程倉庫地址 https://blog.csdn.net/mlq8087/article/details/81360025

如何生成ssh key文件並配置到遠程倉庫: https://www.cnblogs.com/hafiz/p/8146324.html

如果是公司專用的key文件的話,以上的配置還是會報錯,所以仁者見仁智者見智吧

例如報了以下錯誤: 可以參考https://www.cnblogs.com/qichao123/p/8376236.html

git clone [email protected]:xxxia/admin.git

Cloning into 'admin'...

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

The ECDSA host key for gitlab.xxls.cn has changed,

and the key for the corresponding IP address xx.xxx.xx.138

is unknown. This could either mean that

DNS SPOOFING is happening or the IP address for the host

and its host key have changed at the same time.

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

Someone could be eavesdropping on you right now (man-in-the-middle attack)!

It is also possible that a host key has just been changed.

The fingerprint for the ECDSA key sent by the remote host is

SHA256:RIlRjsMUfj3RHw1q0CrxdIqJxGVuo6DMP3Vfg.

Please contact your system administrator.

Add correct host key in /Users/xxxxli/.ssh/known_hosts to get rid of this message.

Offending RSA key in /Users/xxxli/.ssh/known_hosts:2

ECDSA host key for gitlab.xxxxls.cn has changed and you have requested strict checking.

Host key verification failed.

fatal: Could not read from remote repository.

 

Please make sure you have the correct access rights

and the repository exists.

 

參考資料:

https://mp.weixin.qq.com/s/rskietuD9OQirOrKWG-Wfw

https://blog.csdn.net/u014702421/article/details/81209800 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章