Git基礎常用功能


一、安裝

具體查看 安裝Git

 windows下git bash坑

不能使用上/下鍵切換選項

參考:https://blog.csdn.net/csdn_yudong/article/details/86613435

推薦直接使用數字代替,從1開始

 

 

二、使用

基礎知識

  • 工作區(Workspace):就是你在電腦里能看到的項目目錄。
  • 暫存區(Index / Stage):臨時存放更改的地方,使用命令"git add <.|file>"就是把文件加入暫存區。一般存放在 ".git目錄下" 下的index文件(.git/index)中,所以我們把暫存區有時也叫作索引(index)。
  • 版本庫(Repository):管理版本的文件,使用"git commit -m 'description'"就是把暫存區的文件提交到版本庫。工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
  • 遠程倉庫(Remote):托管代碼的服務器。可以簡單的認為是你項目組中的一台電腦用於遠程數據交換

一張圖描述git的文件如何在各個區域之前流轉:

origin:遠程倉庫庫默認別名

master:  倉庫默認分支的名稱
 

本地項目初始化/和遠程倉庫操作

git init,把當前文件夾初 始化位git工程
git remote add [<options>] <name> <url>  把當前文件夾關聯遠程倉庫並命名,比如git remote add origin git@server-name:path/repo-name.git;
git remote -v 查看遠程倉庫地址
git push <遠程主機名> <本地分支名>  <遠程分支名>,比如 git push origin dev dev
git push -u origin master 如果當前分支與多個主機存在追蹤關系,則可以使用 -u 參數指定一個默認主機,這樣后面就可以不加任何參數使用git push
git remote set-url origin git@your.server:new-name.git // 修改遠程倉庫名稱。要確保新的倉庫已經再遠程存在才行
git clone <repo> // 克隆遠程倉庫到本地(各種分支/歷史記錄一並克隆),當從github上克隆時可能非常慢,有幾種方式減少克隆量
git clone --depth <depth> <repo> // 只克隆最新depth層副本。比如git clone --depth 1  https://github.com/vuejs/vue.git,只拷貝vue最新的一條提交。包含這條提交對應的分支和tag
git pull  // 拉取並合並最新的遠程數據,其中 --unshallow可以將歷史的commit都拉取過來。--depth方式的clone看log只能看到設置的條數。
git clone -b <branch> <repo> // 只拷貝指定的分支
 

基本操作:添加/提交/查看記錄

"git add ."或者"git add <file>",將所有文件或指定文件從工作區添加到暫存區
git commit -m "description",將暫存區的所有文件提交到版本庫
git commit --amend -m "xxxx"修改上一次的提交信息
git show <commitId> <filename> :查看提交詳情
git status,查看當前工作區和暫存區的文件狀態
git diff,查看當前工作區對比暫存區的更改
git diff HEAD -- readme.txt命令可以查看工作區和版本庫里面最新版本的區別
“git log”或"git log <file>",查看版本庫或者指定文件的提交記錄
git log --graph命令可以看到分支合並圖。
git log --pretty=oneline --graph --abbrev-commit展示效果如下

 git cherry-pick <commitId>,復制一個特定的提交到當前分支,比如master分支的bug修復提交復制到dev分支

 git cherry-pick commitId1..commitId100,復制兩個commit之間的提交到當前分支,注意:不包括commitId1

若要合並某個分支上的一系列提交,還有另一種方式。
需要使用rebase指令進行合並操作
具體操作步驟:
// 以**最后一次提交**為節點, 創建一個新的分支<newbranch 是新分支的名字>
1. git checkout -b newbranch 最后一次提交的id
// 再 rebase 這個新分支的commit到目標分支上<--onto 目標分支>。<start_id> 指明你想從哪個特定的commit開始。
2. git rebase --onto 目標分支 start_id
 兩個操作一樣,都是重新生產commit副本。 不是移動從A分支移動commit到B分支(移動之后,移出的分支的commit將消失)

倉庫分支管理

查看分支:git branch
創建分支:git branch <name>
切換分支:git checkout <name>或者git switch <name>
創建+切換分支:git checkout -b <name>或者git switch -c <name>
比如git checkout -b dev,切換並創建dev分支,相當於
$ git branch dev
$ git checkout dev
從某個commit切出分支:git checkout commitId -b 本地新branchName 
合並某分支到當前分支:git merge <name>
正常合並如果能用fast-forward就會使用, 但這種模式下,刪除分支后,會丟掉分支信息。可以使用--no-ff強制禁用ff模式
git merge --no-ff -m "merge with no-ff" dev
因為本次合並要創建一個新的commit,所以加上-m參數,把commit描述寫進去。
git branch -d <name>,刪除本地分支:
git push origin --delete 分支名,刪除遠程分支
git push origin :分支名,刪除遠程分支,同上
git branch -m old_branch new_branch,本地分支更名
git fetch -p, fetch之后刪除掉沒有與遠程分支對應的本地分支

例1. git遠程分支已經刪除,本地還能看到解決辦法

當我們刪除遠程分支后執行git branch -a本地卻依然能看到遠程分支

這個時候我們只需要執行git remote prune origin清理一下就可以了

然后再次執行git branch -a就看不到啦

 

代碼回退

看上面的幾個區域的圖基本就能明白

 "git reset HEAD" 或者"git reset HEAD <file>"命令,暫存區的目錄樹或文件會被重寫,被 master 分支指向的目錄樹或文件所替換,但是工作區不受影響。

git reset --hard HEAD^/git reset --hard 1094a,強制回退上一個版本/回退到指定版本號的版本,版本庫會直接回退(遠程倉庫不會回退),需要特別謹慎。刪除工作空間改動代碼,撤銷commit,撤銷git add . 
git reset --soft HEAD^/git reset --soft 1094a,不刪除工作空間改動代碼,撤銷commit,不撤銷git add . 

 "git rm --cached <file>" 命令,會直接從暫存區刪除文件,工作區則不做出改變。

 "git checkout ." 或者 "git checkout -- <file>" 命令,會用暫存區全部或指定的文件替換工作區的文件。這個操作很危險,會清除工作區中未添加到暫存區的改動。

"git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令時,會用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區和以及工作區中的文件。這個命令也是極具危險性的,因為不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。

“git revert HEAD/git revert commitID”: 放棄已經push的指定版本的修改,會新增一條記錄,版本會遞增
"git reflog" , 用來查看你的每一條命令,用來配合上面的命令恢復你的誤操作
 
例1:將單個文件(a.js)回退到某一版本
  1. git  log a.js查看a.js的更改記錄
  2. git reset   fcd2093  a.js 先將暫存區中的該文件回退到歷史版本fcd2093
  3. git checkout -- a.js 暫存區中該文件的歷史版本(fcd2093)覆蓋工作區中對應的文件,此時(工作區、暫存區的文件a.js是fcd2093版本)。
【注】git reset [選項]  [版本號]  [回退對象]命令,當回退對象是文件時選項不能為hard
【注】2、3步可以合並成一步git checkout fcd2093 a.js
此時,如果git commit 提交暫存區的數據到版本庫,則會重新生成一條記錄
 
例2:將整個項目(遠程倉庫和本地倉庫當前版本一致)回退到某個版本,並push到遠程倉庫,讓遠程倉庫也回退。
  例如,版本庫最新的幾條提交記錄是:aaaa -> bbbb -> cccc;cccc是最新的提交記錄,要回退到aaaa並push
  1. git reset --hard aaaa 強制將版本庫回退到aaaa,但是遠程倉庫還是cccc
  2. git reset cccc 將head移到最新的版本(和遠程的head保持一致,實際就是將遠程暫存區的內容更新到最新版本cccc,工作區的內容還是保持在aaaa),此時aaaa和cccc的差異便作為本次更改的內容。
  3. git add / git commit / git push 提交后生成新的版本號dddd

此時git log 看到的最近的提交記錄就是:aaaa -> bbbb -> cccc -> dddd

【注】也可以使用git revert cccc 和 git revert bbbb來實現,不過會新增兩條回滾記錄

 
例3: 將整個項目(遠程倉庫和本地倉庫當前版本一致)回退到某個版本,並push到遠程倉庫,讓遠程倉庫也回退(並且不保留已經被撤銷的提交)

如果刪除遠程倉庫的最后一次提交的時候不需要保留歷史記錄的話,可以使用reset,命令如下:

    git reset --hard HEAD^
    git push origin master -f

保留半成品現場(存儲臨時現場)

主要用在目前還不想提交的但是已經修改的內容進行保存至堆棧中,后續可以在某個分支上恢復出堆棧中的內容
git stash 存儲臨時現場
git stash list 查看工作臨時現場
一是用git stash apply恢復,但是恢復后,stash內容並不刪除,你需要用git stash drop來刪除;
另一種方式是用git stash pop,恢復的同時把stash內容也刪了
你可以多次stash,恢復的時候,先用git stash list查看,然后恢復指定的stash,用命令:
git stash apply stash@{0}
 
git stash drop stash@{0} ,刪除第一個隊列
 

子模塊

有時工程太過龐大想要分出子工程單獨管理,或者納入一個子工程到當前工程來,就可能用到子模塊功能。

git子模塊配置處理(即git的B倉庫被作為A倉庫的子目錄),兩個倉庫可以各自管理和提交
git submodule add <path> <name>:將<path>對應的倉庫作為當前倉庫A的<name>子目錄
git status:在A中查看發現多了<name>和 .gitmodules(這個文件中是子模塊的相關配置)
git diff --cached <name>:在A中看到無法查詢子模塊的提交記錄, 取而代之的是,Git 將它記錄成來自B倉庫的一個特殊的提交(這個提交在克隆的該項目時,進入子模塊就是進入到這個提交)
例如,子模塊B的名稱為subproject_demo:
$ git diff --cached subproject_demo
diff --git a/subproject_demo b/subproject_demo
new file mode 160000
index 0000000..aa1eeb0 --- /dev/null
+++ b/subproject_demo
@@ -0,0 +1 @@
+Subproject commit aa1eeb06e67608d7a2af179a7dfd9e594777e90f
git commit -m 'first commit with submodule xxx': 結果中注意 subproject_demo條目的 160000 模式。這在Git中是一個特殊模式,基本意思是你將一個提交記錄為一個目錄項而不是子目錄或者文件。
當你使用clone克隆該項目(父工程A)時,會發現子模塊的文件夾內容為空,需要做:
git submodule init: 初始化你的本地配置文件
git submodule update:從子模塊B拉取所有數據並檢出你上層項目里所列的合適的提交(保持子模塊是最新的那個)
進入子模塊,發現子模塊是那個項目的 你先前提交的確切狀態的分支
chen_@DESKTOP-TJKEMKG MINGW64 /c/works/demo/subproject_demo  ((aa1eeb0...))
// 發現沒:aa1eeb0就是之前的哪個提交

如果你在項目中改了子模塊的代碼,准備提交到對應的分支(add和commit已經執行過),使用:

git push origin HEAD:<branch>   這樣就把代碼提交到對應的分支 ,和 git push origin <localBranch> <remoteBranch>類似

如果其他人有修改這個子模塊並提交到A工程,你可以重新pull A項目分支,然后執行git submodule update保證子模塊也是最新的
git clone --recurse-submodules <repositary> ,他就會自動初始化並更新倉庫的每一個子模塊
 
【注】使用時要注意,最好保證在父工程A中來自B的提交永遠來自同一個B的分支,比如master分支。所以B的分支代碼更改完畢並測試完畢合並到master后,再在A提交來自B的master分支的提交

【注】引入私有git工程還可以又其他方式,比如和npm配合:《2018 年了,你還是只會 npm install 嗎》查看“私有 git 共享 package”部分

 

打標簽

你可以使用 阿里的AoneFlow模式 使用Git做分支管理,每次發完版本之后需要給當前的master打一個tag,表示發布的一個版本,以便追溯。

git tag,展示所有已經打過的標簽

git tag -l 'v1.8.5*',匹配特定的標簽查看

git tag -a v1.4 -m "my version 1.4",打附注標簽

git tag -a v1.4 932cab, 后期給932cab提交補打上標簽

git tag v1.4-lw,打輕量標簽,沒有標簽信息

git tag -d v1.4,刪除表情按【謹慎】

git git push origin :refs/tags/v1.4,刪除遠程v1.4這個標簽

git show v1.4,命令可以看到標簽信息與對應的提交信息

git push origin v1.4,共享標簽,默認情況下,git push 命令並不會傳送標簽到遠程倉庫服務器上。 在創建完標簽后你必須顯式地推送標簽到共享服務器上

git push origin --tags,一次性把所有標簽push到遠程

 
           

【注】:更詳細查看https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE

 

https和ssh使用

查看鏈接:https://blog.csdn.net/qq_42108192/article/details/90168968

 

https模式下添加git賬號到項目,push不用每次輸入賬號密碼

打開.git文件的下的 vim .git/config新增以下內容

[user]
name = XXXX05@qq.com
email = XXXX05@qq.com
[credential]
helper=store

 

 合並commit/修改歷史commit

合並commit用到git rebase,參考:https://www.cnblogs.com/laphome/p/11309834.html https://www.jianshu.com/p/964de879904a

需要注意的是,如果只是squash中間的部分節點。保存之后可能后面的pick執行會執行不了,提示如下

hint: Could not execute the todo command
hint: 
hint:     pick 4d45xxxx918364 xxxx
hint: 
hint: It has been rescheduled; To edit the command before continuing, please
hint: edit the todo list first:
hint: 
hint:     git rebase --edit-todo
hint:     git rebase --continue

明顯后面的pick沒有執行(導致漏掉),按提示先執行--edit-todo,然后--continue就OK

注意:然后要將修改過后的commit提交到遠程(在提交之前不要使用git pull。這回導致之前合並之前的commit記錄會被再次下載下來)。使用:git push -f 【需要特別注意,這個動作將不可回退,建議使用一個拷貝的分支來做這些動作】 

修改歷史commit查看:https://blog.csdn.net/jbj6568839z/article/details/102797968

注意:為了確保edit后面的pick繼續執行,一定要執行“git rebase --continue”    。修改歷史commit這個操作會在一個副本上進行。完畢只有需要將記錄push到對應的分支上:

git push origin HEAD:<name-of-remote-branch>  如果失敗,加 -f 強制覆蓋(要特別小心,強制覆蓋會導致之前的記錄消失)

 

Enter passphrase for key '/c/Users/Administrator/.ssh/id_rsa'

https://www.jianshu.com/p/b6545f4cd317

  1. ssh-agent bash
  2. ssh-add ~/.ssh/id_rsa

 

 

更新一組依賴包 

 

1.npm-check-updates

// 先下載

yarn global add npm-check-updates

// 更新包(@kant @rousseau @alice)下的所有子包

ncu \"/@(kant|rousseau|alice)\\/\\S+/\" -u 

 

2.upgrade-interactive

yarn upgrade-interactive --latest
// 需要手動選擇升級的依賴包,按空格鍵選擇,a 鍵切換所有,i 鍵反選選擇

 

3.upgrade
yarn upgrade package@version
// yarn.lock和package.json都會更新,但是會進行版本鎖定 "echarts": "4.2.0-rc.2"

 

 

三、踩坑

[remote rejected]  (hook declined)

完整日志:

$ git push
Enumerating objects: 25, done.
Counting objects: 100% (24/24), done.
Delta compression using up to 8 threads
Compressing objects: 100% (13/13), done.
Writing objects: 100% (13/13), 1.20 KiB | 1.20 MiB/s, done.
Total 13 (delta 11), reused 0 (delta 0)
remote: git: 'refs/heads/web2.0' is not a git command. See 'git --help'.
remote: error: hook declined to update refs/heads/web2.0
To https://e.coding.net/tops/front-www.git
 ! [remote rejected] web2.0 -> web2.0 (hook declined)
error: failed to push some refs to 'https://e.coding.net/tops/front-www.git'

百度查看幫助,找到類似的問題:https://blog.csdn.net/weixin_39278265/article/details/102248258

本人的問題解決辦法

git config --global --unset branch.web2.0.merge

然后再push就OK

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM