久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

三年Git使用心得 & 常見(jiàn)問(wèn)題整理,,80%的人都不懂

 精品唯居 2021-10-11

Git 流程圖

 

 

  • Workspace:工作區(qū)

  • Index / Stage:暫存區(qū)

  • Repository:倉(cāng)庫(kù)區(qū)(或本地倉(cāng)庫(kù))

  • Remote:遠(yuǎn)程倉(cāng)庫(kù)

配置 Git:另外技術(shù)是不斷更新的。在此贈(zèng)送2020最新企業(yè)級(jí)別Vue3.0/Js/ES6/TS/React/node等實(shí)戰(zhàn)視頻教程,,想學(xué)的可進(jìn)裙 519293536 免費(fèi)獲取,,小白勿進(jìn)哦

# 配置全局用戶
$ git config --global user.name "用戶名" 
$ git config --global user.email "git賬號(hào)"
# 配置別名
$ git config --global alias.co checkout
$ git config --global alias.ss status
$ git config --global alias.cm commit
$ git config --global alias.br branch
$ git config --global alias.rg reflog
# 這里只是美化 log 的輸出,實(shí)際使用時(shí)可以在 git lg 后面加命令參數(shù),,如: git lg -10 顯示最近10條提交
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
# 刪除全局配置
$ git config --global --unset alias.xxx
$ git config --global --unset user.xxx復(fù)制代碼

查看 Git 信息

# 查看系統(tǒng)配置
$ git config --list
# 查看用戶配置
$ cat ~/.gitconfig 
# 查看當(dāng)前項(xiàng)目的 git 配置
$ cat .git/config
# 查看暫存區(qū)的文件
$ git ls-files
# 查看本地 git 命令歷史
$ git reflog
# 查看所有 git 命令
$ git --help -a 
# 查看當(dāng)前 HEAD 指向
$ cat .git/HEAD

# git 中 D 向下翻一行  F 向下翻頁(yè)  B 向上翻頁(yè)  Q 退出
# 查看提交歷史
$ git log --oneline  
          --grep="關(guān)鍵字"
          --graph 
          --all      
          --author "username"     
          --reverse 
          -num
          -p
          --before=  1  day/1  week/1  "2019-06-06" 
          --after= "2019-06-06"
          --stat 
          --abbrev-commit 
          --pretty=format:"xxx"
          
# oneline -> 將日志記錄一行一行的顯示
# grep="關(guān)鍵字" -> 查找日志記錄中(commit提交時(shí)的注釋)與關(guān)鍵字有關(guān)的記錄
# graph -> 記錄圖形化顯示 ?。?!    
# all -> 將所有記錄都詳細(xì)的顯示出來(lái)
# author "username" -> 查找這個(gè)作者提交的記錄
# reverse -> commit 提交記錄順序翻轉(zhuǎn)      
# before -> 查找規(guī)定的時(shí)間(如:1天/1周)之前的記錄   
# num -> git log -10 顯示最近10次提交 ?。?!    
# stat -> 顯示每次更新的文件修改統(tǒng)計(jì)信息,,會(huì)列出具體文件列表 !??!
# abbrev-commit -> 僅顯示 SHA-1 的前幾個(gè)字符,而非所有的 40 個(gè)字符 ?。,。?# pretty=format:"xxx" ->  可以定制要顯示的記錄格式 ?。,。?# p -> 顯示每次提交所引入的差異(按 補(bǔ)丁 的格式輸出)?。,。?fù)制代碼

git reflog

  • 顯示的是一個(gè) HEAD 指向發(fā)生改變的時(shí)間列表。在你切換分支,、用 git commit 進(jìn)行提交,、以及用 git reset 撤銷 commit 時(shí),HEAD 指向會(huì)改變,,但當(dāng)你進(jìn)行 git checkout -- <filename> 撤銷或者 git stash 存儲(chǔ)文件等操作時(shí),,HEAD 并不會(huì)改變,這些修改從來(lái)沒(méi)有被提交過(guò),,因此 reflog 也無(wú)法幫助我們恢復(fù)它們,。

  • git reflog 不會(huì)永遠(yuǎn)保持,Git 會(huì)定期清理那些 “用不到的” 對(duì)象,,不要指望幾個(gè)月前的提交還一直在那里,。

git log 點(diǎn)線圖

  • git 中一條分支就是一個(gè)指針,新建一條分支就是基于當(dāng)前指針新建一個(gè)指針

  • 切換至某個(gè)分支 ,,就是將 HEAD 指向某條分支(指針)

  • 切換至某個(gè) commit ,,就是將 HEAD 指向某個(gè) commit

符號(hào)解釋:

*表示一個(gè) commit
|表示分支前進(jìn)
/表示分叉
\表示合入
|/表示新分支復(fù)制代碼

Git 常用命令

# 查看工作區(qū)和暫存區(qū)的狀態(tài)
$ git status 
# 將工作區(qū)的文件提交到暫存區(qū)
$ git add .  
# 提交到本地倉(cāng)庫(kù)
$ git commit -m "本次提交說(shuō)明"
# add和commit的合并,便捷寫法(未追蹤的文件無(wú)法直接提交到暫存區(qū)/本地倉(cāng)庫(kù))
$ git commit -am "本次提交說(shuō)明"  
# 將本地分支和遠(yuǎn)程分支進(jìn)行關(guān)聯(lián)
$ git push -u origin branchName 
# 將本地倉(cāng)庫(kù)的文件推送到遠(yuǎn)程分支
$ git push
# 拉取遠(yuǎn)程分支的代碼
$ git pull origin branchName 
# 合并分支
$ git merge branchName 
# 查看本地?fù)碛心男┓种?$ git branch
# 查看所有分支(包括遠(yuǎn)程分支和本地分支)
$ git branch -a 
# 切換分支
$ git checkout branchName 
# 臨時(shí)將工作區(qū)文件的修改保存至堆棧中
$ git stash
# 將之前保存至堆棧中的文件取出來(lái)
$ git stash pop復(fù)制代碼

Git 常用命令詳解

add

將工作區(qū)的文件添加到暫存區(qū)

# 添加指定文件到暫存區(qū)(追蹤新增的指定文件)
$ git add [file1] [file2] ...
# 添加指定目錄到暫存區(qū),,包括子目錄
$ git add [dir]
# 添加當(dāng)前目錄的所有文件到暫存區(qū)(追蹤所有新增的文件)
$ git add .
# 刪除工作區(qū)/暫存區(qū)的文件
$ git rm [file1] [file2] ...
# 停止追蹤指定文件,,但該文件會(huì)保留在工作區(qū)
$ git rm --cached [file]
# 改名工作區(qū)/暫存區(qū)的文件
$ git mv [file-original] [file-renamed]

# Git 2.0 以下版本
#只作用于文件的新增和修改
$ git add .  
#只作用于文件的修改和刪除
$ gti add -u
#作用于文件的增刪改
$ git add -A 

# Git 2.0 版本
$ git add . 等價(jià)于 $ git add -A 
復(fù)制代碼
  • git add . :操作的對(duì)象是“當(dāng)前目錄”所有文件變更,"." 表示當(dāng)前目錄,。會(huì)監(jiān)控工作區(qū)的狀態(tài)樹(shù),,使用它會(huì)把工作區(qū)的所有變化提交到暫存區(qū),包括文件內(nèi)容修改(modified)以及新文件(new),,但不包括被刪除的文件,。

  • git add -u :操作的對(duì)象是整個(gè)工作區(qū)已經(jīng)跟蹤的文件變更,無(wú)論當(dāng)前位于哪個(gè)目錄下,。僅監(jiān)控已經(jīng)被 add 的文件(即 tracked file),,它會(huì)將被修改的文件(包括文件刪除)提交到暫存區(qū)。git add -u 不會(huì)提交新文件(untracked file),。(git add --update 的縮寫)

  • git add -A :操作的對(duì)象是“整個(gè)工作區(qū)”所有文件的變更,,無(wú)論當(dāng)前位于哪個(gè)目錄下。是上面兩個(gè)功能的合集(git add --all 的縮寫),。

status

# 查看工作區(qū)和暫存區(qū)的狀態(tài)
$ git status 
復(fù)制代碼

commit

# 將暫存區(qū)的文件提交到本地倉(cāng)庫(kù)并添加提交說(shuō)明
$ git commit -m "本次提交的說(shuō)明"   

# add 和 commit 的合并,,便捷寫法
# 和 git add -u 命令一樣,未跟蹤的文件是無(wú)法提交上去的
$ git commit -am "本次提交的說(shuō)明"  

# 跳過(guò)驗(yàn)證繼續(xù)提交
$ git commit --no-verify
$ git commit -n

# 編輯器會(huì)彈出上一次提交的信息,,可以在這里修改提交信息
$ git commit --amend
# 修復(fù)提交,,同時(shí)修改提交信息
$ git commit --amend -m "本次提交的說(shuō)明"
# 加入 --no-edit 標(biāo)記會(huì)修復(fù)提交但不修改提交信息,編輯器不會(huì)彈出上一次提交的信息
$ git commit --amend --no-edit復(fù)制代碼
  • git commit --amend 既可以修改上次提交的文件內(nèi)容,,也可以修改上次提交的說(shuō)明,。會(huì)用一個(gè)新的 commit 更新并替換最近一次提交的 commit ,。如果暫存區(qū)有內(nèi)容,,這個(gè)新的 commit 會(huì)把任何修改內(nèi)容和上一個(gè) commit 的內(nèi)容結(jié)合起來(lái),。如果暫存區(qū)沒(méi)有內(nèi)容,,那么這個(gè)操作就只會(huì)把上次的 commit 消息重寫一遍,。永遠(yuǎn)不要修復(fù)一個(gè)已經(jīng)推送到公共倉(cāng)庫(kù)中的提交,會(huì)拒絕推送到倉(cāng)庫(kù)

push & pull

  • 分支推送順序的寫法是 <來(lái)源地>:<目的地>

# 將本地倉(cāng)庫(kù)的文件推送到遠(yuǎn)程分支
# 如果遠(yuǎn)程倉(cāng)庫(kù)沒(méi)有這個(gè)分支,,會(huì)新建一個(gè)同名的遠(yuǎn)程分支
# 如果省略遠(yuǎn)程分支名,,則表示兩者同名
$ git push <遠(yuǎn)程主機(jī)名> <本地分支名>:<遠(yuǎn)程分支名>
$ git push origin branchname  

# 如果省略本地分支名,,則表示刪除指定的遠(yuǎn)程分支
# 因?yàn)檫@等同于推送一個(gè)空的本地分支到遠(yuǎn)程分支,。
$ git push origin :master
# 等同于
$ git push origin --delete master

# 建立當(dāng)前分支和遠(yuǎn)程分支的追蹤關(guān)系
$ git push -u origin master
# 如果當(dāng)前分支與遠(yuǎn)程分支之間存在追蹤關(guān)系
# 則可以省略分支和 -u 
$ git push

# 不管是否存在對(duì)應(yīng)的遠(yuǎn)程分支,,將本地的所有分支都推送到遠(yuǎn)程主機(jī)
$ git push --all origin

# 拉取所有遠(yuǎn)程分支到本地鏡像倉(cāng)庫(kù)中
$ git pull
# 拉取并合并項(xiàng)目其他人員的一個(gè)分支 
$ git pull origin branchname  
# 等同于 fetch + merge
$ git fetch origin branchName
$ git merge origin/branchName

# 如果遠(yuǎn)程主機(jī)的版本比本地版本更新,推送時(shí) Git 會(huì)報(bào)錯(cuò),,要求先在本地做 git pull 合并差異,,
# 然后再推送到遠(yuǎn)程主機(jī)。這時(shí),,如果你一定要推送,,可以使用 –-force 選項(xiàng) 
# (盡量避免使用)
$ git push --force origin | git push -f origin復(fù)制代碼

branch

# 查看本地分支
$ git branch | git branch -l 
# 查看遠(yuǎn)程分支
$ git branch -r 
# 查看所有分支(本地分支+遠(yuǎn)程分支)
$ git branch -a 
# 查看所有分支并帶上最新的提交信息
$ git branch -av 
# 查看本地分支對(duì)應(yīng)的遠(yuǎn)程分支
$ git branch -vv 

# 新建分支
# 在別的分支下新建一個(gè)分支,新分支會(huì)復(fù)制當(dāng)前分支的內(nèi)容
# 注意:如果當(dāng)前分支有修改,,但是沒(méi)有提交到倉(cāng)庫(kù),,此時(shí)修改的內(nèi)容是不會(huì)被復(fù)制到新分支的
$ git branch branchname 
# 切換分支(切換分支時(shí),本地工作區(qū),,倉(cāng)庫(kù)都會(huì)相應(yīng)切換到對(duì)應(yīng)分支的內(nèi)容)
$ git checkout branchname 
# 創(chuàng)建一個(gè) aaa 分支,,并切換到該分支 (新建分支和切換分支的簡(jiǎn)寫)
$ git checkout -b aaa 
# 可以看做是基于 master 分支創(chuàng)建一個(gè) aaa 分支,,并切換到該分支
$ git checkout -b aaa master

# 新建一條空分支(詳情請(qǐng)看問(wèn)題列表)
$ git checkout --orphan emptyBranchName
$ git rm -rf . 

# 刪除本地分支,會(huì)阻止刪除包含未合并更改的分支
$ git brnach -d branchname 
# 強(qiáng)制刪除一個(gè)本地分支,,即使包含未合并更改的分支
$ git branch -D branchname  
# 刪除遠(yuǎn)程分支
# 推送一個(gè)空分支到遠(yuǎn)程分支,其實(shí)就相當(dāng)于刪除遠(yuǎn)程分支
$ git push origin  :遠(yuǎn)程分支名
# 或者
$ git push origin --delete 遠(yuǎn)程分支名 

# 修改當(dāng)前分支名
$ git branch -m branchname 
復(fù)制代碼

merge 三種常用合并方法

# 默認(rèn) fast-forward ,,HEAD 指針直接指向被合并的分支
$ git merge 

# 禁止快進(jìn)式合并
$ git merge --no-ff 

$ git merge --squash 
復(fù)制代碼

 

 

  • fast-forward:會(huì)在當(dāng)前分支的提交歷史中添加進(jìn)被合并分支的提交歷史(得先理解什么時(shí)候會(huì)發(fā)生快速合并,,并不是每次 merge 都會(huì)發(fā)生快速合并);

  • --no-ff:會(huì)生成一個(gè)新的提交,,讓當(dāng)前分支的提交歷史不會(huì)那么亂,;

  • --squash:不會(huì)生成新的提交,會(huì)將被合并分支多次提交的內(nèi)容直接存到工作區(qū)和暫存區(qū),,由開(kāi)發(fā)者手動(dòng)去提交,,這樣當(dāng)前分支最終只會(huì)多出一條提交記錄,不會(huì)摻雜被合并分支的提交歷史

rebase

www./wiki/896043…

/book/zh/v2/…

www.jianshu.com/p/4a8f4af4e…

/post/5a5438…

stash

  • 能夠?qū)⑺形刺峤坏男薷谋4嬷炼褩V?,用于后續(xù)恢復(fù)當(dāng)前工作區(qū)內(nèi)容

  • 如果文件沒(méi)有提交到暫存區(qū)(使用 git add . 追蹤新的文件),,使用該命令會(huì)提示 No local changes to save ,無(wú)法將修改保存到堆棧中

使用場(chǎng)景: 當(dāng)你接到一個(gè)修復(fù)緊急 bug 的任務(wù)時(shí)候,,一般都是先創(chuàng)建一個(gè)新的 bug 分支來(lái)修復(fù)它,,然后合并,最后刪除。但是,,如果當(dāng)前你正在開(kāi)發(fā)功能中,,短時(shí)間還無(wú)法完成,無(wú)法直接提交到倉(cāng)庫(kù),,這時(shí)候可以先把當(dāng)前工作區(qū)的內(nèi)容 git stash 一下,,然后去修復(fù) bug,修復(fù)后,,再 git stash pop,,恢復(fù)之前的工作內(nèi)容。

# 將所有未提交的修改(提交到暫存區(qū))保存至堆棧中
$ git stash 
# 給本次存儲(chǔ)加個(gè)備注,,以防時(shí)間久了忘了
$ git stash save "存儲(chǔ)"
# 存儲(chǔ)未追蹤的文件
$ git stash -u

# 查看存儲(chǔ)記錄
$ git stash list

在 Windows 上和 PowerShell 中,,需要加雙引號(hào)
# 恢復(fù)后,stash 記錄并不刪除
$ git stash apply "stash@{index}"
# 恢復(fù)的同時(shí)把 stash 記錄也刪了
$ git stash pop "stash@{index}"
# 刪除 stash 記錄
$ git stash drop "stash@{index}"
# 刪除所有存儲(chǔ)的進(jìn)度
$ git stash clear
# 查看當(dāng)前記錄中修改了哪些文件
$ git stash show "stash@{index}"
# 查看當(dāng)前記錄中修改了哪些文件的內(nèi)容
$ git stash show -p "stash@{index}" 
復(fù)制代碼

diff

# 查看工作區(qū)和暫存區(qū)單個(gè)文件的對(duì)比
$ git diff filename 
# 查看工作區(qū)和暫存區(qū)所有文件的對(duì)比
$ git diff 
# 查看工作區(qū)和暫存區(qū)所有文件的對(duì)比,,并顯示出所有有差異的文件列表
$ git diff --stat   
# 注意:
# 1.你修改了某個(gè)文件,,但是沒(méi)有提交到暫存區(qū),這時(shí)候會(huì)有對(duì)比的內(nèi)容
# 一旦提交到暫存區(qū),,就不會(huì)有對(duì)比的內(nèi)容(因?yàn)闀捍鎱^(qū)已經(jīng)更新)
# 2.如果你新建了一個(gè)文件,,但是沒(méi)有提交到暫存區(qū),這時(shí)候 diff 是沒(méi)有結(jié)果的

# 查看暫存區(qū)與上次提交到本地倉(cāng)庫(kù)的快照(即最新提交到本地倉(cāng)庫(kù)的快照)的對(duì)比
$ git diff --cached/--staged
# 查看工作區(qū)與上次提交到本地倉(cāng)庫(kù)的快照(即最新提交到本地倉(cāng)庫(kù)的快照)的對(duì)比
$ git diff branchname
# 查看工作區(qū)與 HEAD 指向(默認(rèn)當(dāng)前分支最新的提交)的對(duì)比
$ git diff HEAD   

# 查看兩個(gè)本地分支中某一個(gè)文件的對(duì)比
$ git diff branchname..branchname filename 
# 查看兩個(gè)本地分支所有的對(duì)比
$ git diff branchname..branchname 
# 查看遠(yuǎn)程分支和本地分支的對(duì)比
$ git diff origin/branchname..branchname 
# 查看遠(yuǎn)程分支和遠(yuǎn)程分支的對(duì)比
$ git diff origin/branchname..origin/branchname 

# 查看兩個(gè) commit 的對(duì)比
$ git diff commit1..commit2  
復(fù)制代碼

remote

# 查看所有遠(yuǎn)程主機(jī)
$ git remote
# 查看關(guān)聯(lián)的遠(yuǎn)程倉(cāng)庫(kù)的詳細(xì)信息
$ git remote -v 
# 刪除遠(yuǎn)程倉(cāng)庫(kù)的 “關(guān)聯(lián)”
$ git remote rm projectname 
# 設(shè)置遠(yuǎn)程倉(cāng)庫(kù)的 “關(guān)聯(lián)”
$ git remote set-url origin <newurl>復(fù)制代碼

tag

常用于發(fā)布版本

www./wiki/896043…

# 默認(rèn)在 HEAD 上創(chuàng)建一個(gè)標(biāo)簽 
$ git tag v1.0
# 指定一個(gè) commit id 創(chuàng)建一個(gè)標(biāo)簽 
$ git tag v0.9 f52c633
# 創(chuàng)建帶有說(shuō)明的標(biāo)簽,,用 -a 指定標(biāo)簽名,,-m 指定說(shuō)明文字
$ git tag -a v0.1 -m "version 0.1 released" 

# 查看所有標(biāo)簽
# 注意:標(biāo)簽不是按時(shí)間順序列出,而是按字母排序的,。
$ git tag

# 查看單個(gè)標(biāo)簽具體信息
$ git show <tagname>

# 推送一個(gè)本地標(biāo)簽
$ git push origin <tagname>
# 推送全部未推送過(guò)的本地標(biāo)簽
$ git push origin --tags

# 刪除本地標(biāo)簽
# 因?yàn)閯?chuàng)建的標(biāo)簽都只存儲(chǔ)在本地,,不會(huì)自動(dòng)推送到遠(yuǎn)程。
# 所以,,打錯(cuò)的標(biāo)簽可以在本地安全刪除,。
$ git tag -d v0.1
# 刪除一個(gè)遠(yuǎn)程標(biāo)簽(先刪除本地 tag ,然后再刪除遠(yuǎn)程 tag)
$ git push origin :refs/tags/<tagname>復(fù)制代碼

刪除文件

# 刪除暫存區(qū)和工作區(qū)的文件
$ git rm filename  
# 只刪除暫存區(qū)的文件,,不會(huì)刪除工作區(qū)的文件
$ git rm --cached filename 
復(fù)制代碼

如果在配置 .gitignore 文件之前就把某個(gè)文件上傳到遠(yuǎn)程倉(cāng)庫(kù)了,,這時(shí)候想把遠(yuǎn)程倉(cāng)庫(kù)中的該文件刪除,此時(shí)你配置 .gitignore 文件也沒(méi)有用,,因?yàn)樵撐募呀?jīng)被追蹤了,,但又不想在本地刪除該文件后再重新提交到遠(yuǎn)程倉(cāng)庫(kù),這時(shí)候可以使用 git rm --cached filename 命令取消該文件的追蹤,,這樣下次提交的時(shí)候,,git 就不會(huì)再提交這個(gè)文件,從而遠(yuǎn)程倉(cāng)庫(kù)的該文件也會(huì)被刪除

版本切換 & 重設(shè) & 撤銷

  • checkout 可以撤銷工作區(qū)的文件,,reset 可以撤銷工作區(qū)/暫存區(qū)的文件

  • reset 和 checkout 可以作用于 commit 或者文件,,revert 只能作用于 commit

checkout 詳解

# 恢復(fù)暫存區(qū)的指定文件到工作區(qū)
$ git checkout <filename>
# 恢復(fù)暫存區(qū)的所有文件到工作區(qū)
$ git checkout .

# 回滾到最近的一次提交
# 如果修改某些文件后,,沒(méi)有提交到暫存區(qū),此時(shí)的回滾是回滾到上一次提交
# 如果是已經(jīng)將修改的文件提交到倉(cāng)庫(kù)了,,這時(shí)再用這個(gè)命令回滾無(wú)效
# 因?yàn)榛貪L到的是之前自己修改后提交的版本
$ git checkout HEAD 
$ git checkout HEAD -- filename
# 回滾到最近一次提交的上一個(gè)版本
$ git checkout HEAD^ 
# 回滾到最近一次提交的上2個(gè)版本
$ git checkout HEAD^^ 

# 切換分支,,在這里也可以看做是回到項(xiàng)目「當(dāng)前」?fàn)顟B(tài)的方式
$ git checkout <當(dāng)前你正在使用的分支>
# 切換到某個(gè)指定的 commit 版本
$ git checkout <commit_id>
# 切換指定 tag 
$ git checkout <tag>復(fù)制代碼
  • 在開(kāi)發(fā)的正常階段,HEAD 一般指向 master 或是其他的本地分支,,但當(dāng)你使用 git checkout <commit id> 切換到指定的某一次提交的時(shí)候,,HEAD 就不再指向一個(gè)分支了——它直接指向一個(gè)提交,HEAD 就會(huì)處于 detached 狀態(tài)(游離狀態(tài)),。

  • 切換到某一次提交后,,你可以查看文件,編譯項(xiàng)目,,運(yùn)行測(cè)試,,甚至編輯文件而不需要考慮是否會(huì)影響項(xiàng)目的當(dāng)前狀態(tài),你所做的一切都不會(huì)被保存到主棧的倉(cāng)庫(kù)中,。當(dāng)你想要回到主線繼續(xù)開(kāi)發(fā)時(shí),,使用 git checkout branchName 回到項(xiàng)目初始的狀態(tài)(這時(shí)候會(huì)提示你是否需要新建一條分支用于保留剛才的修改)。

  • 哪怕你切換到了某一版本的提交,,并且對(duì)它做了修改后,,不小心提交到了暫存區(qū),只要你切換回分支的時(shí)候,,依然會(huì)回到項(xiàng)目的初始狀態(tài),。(注意:你所做的修改,如果 commit 了,,會(huì)被保存到那個(gè)版本中,。切換完分支后,會(huì)提示你是否要新建一個(gè)分支來(lái)保存剛才修改的內(nèi)容,。如果你剛才解決了一個(gè) bug ,,這時(shí)候可以新建一個(gè)臨時(shí)分支,,然后你本地自己的開(kāi)發(fā)主分支去合并它,,合并完后刪除臨時(shí)分支)。

  • 一般我都是用 checkout 回退版本,,查看歷史代碼,,測(cè)試 bug 在哪

 

image.pngimage.pngimage.png

 

reset 詳解

git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD]:將當(dāng)前的分支重設(shè)(reset)到指定的 <commit> 或者 HEAD (默認(rèn),如果不顯示指定 <commit>,,默認(rèn)是 HEAD ,,即最新的一次提交),并且根據(jù) [mode] 有可能更新索引和工作目錄,。mode 的取值可以是 hard,、soft,、mixedmerged,、keep ,。

# 從暫存區(qū)撤銷特定文件,但不改變工作區(qū),。它會(huì)取消這個(gè)文件的暫存,,而不覆蓋任何更改
$ git reset <fileName>
# 重置暫存區(qū)最近的一次提交,但工作區(qū)的文件不變
$ git reset 
# 等價(jià)于 
$ git reset HEAD (默認(rèn))
# 重置暫存區(qū)與工作區(qū),,回退到最近一次提交的版本內(nèi)容
$ git reset --hard 
# 重置暫存區(qū)與工作區(qū),,回退到最近一次提交的上一個(gè)版本
$ git reset --hard HEAD^ 

# 將當(dāng)前分支的指針指向?yàn)橹付?nbsp;commit(該提交之后的提交都會(huì)被移除),同時(shí)重置暫存區(qū),,但工作區(qū)不變
$ git reset <commit>
# 等價(jià)于 
$ git reset --mixed  <commit>

# 將當(dāng)前分支的指針指向?yàn)橹付?nbsp;commit(該提交之后的提交都會(huì)被移除),,但保持暫存區(qū)和工作區(qū)不變
$ git reset --soft  <commit>
# 將當(dāng)前分支的指針指向?yàn)橹付?nbsp;commit(該提交之后的提交都會(huì)被移除),同時(shí)重置暫存區(qū),、工作區(qū)
$ git reset --hard  <commit>復(fù)制代碼
  • git reset 有很多種用法,。它可以被用來(lái)移除提交快照,盡管它通常被用來(lái)撤銷暫存區(qū)和工作區(qū)的修改,。不管是哪種情況,,它應(yīng)該只被用于本地修改——你永遠(yuǎn)不應(yīng)該重設(shè)和其他開(kāi)發(fā)者共享的快照。

  • 當(dāng)你用 reset 回滾到了某個(gè)版本后,,那么在下一次 git 提交時(shí),,之前該版本后面的版本會(huì)被作為垃圾刪掉。

  • 當(dāng)我們回退到一個(gè)舊版本后,,此時(shí)再用 git log 查看提交記錄,,會(huì)發(fā)現(xiàn)之前的新版本記錄沒(méi)有了。如果第二天,,你又想恢復(fù)到新版本怎么辦,?找不到新版本的 commit_id 怎么辦?

我們可以用 git reflog 查看歷史命令,,這樣就可以看到之前新版本的 commit_id ,,然后 git reset --hard commit_id 就可以回到之前的新版本代碼

  • 雖然可以用 git reflog 查看本地歷史,然后回復(fù)到之前的新版本代碼,,但是在別的電腦上是無(wú)法獲取你的歷史命令的,,所以這種方法不安全。萬(wàn)一你的電腦突然壞了,,這時(shí)候就無(wú)法回到未來(lái)的版本,。

revert 詳解

# 生成一個(gè)撤銷最近的一次提交的新提交
$ git revert HEAD 
# 生成一個(gè)撤銷最近一次提交的上一次提交的新提交
$ git revert HEAD^ 
# 生成一個(gè)撤銷最近一次提交的上兩次提交的新提交
$ git revert HEAD^^ 
# 生成一個(gè)撤銷最近一次提交的上n次提交的新提交
$ git revert HEAD~num 

# 生成一個(gè)撤銷指定提交版本的新提交
$ git revert <commit_id>
# 生成一個(gè)撤銷指定提交版本的新提交,執(zhí)行時(shí)不打開(kāi)默認(rèn)編輯器,,直接使用 Git 自動(dòng)生成的提交信息
$ git revert <commit_id> --no-edit復(fù)制代碼

git revert命令用來(lái)撤銷某個(gè)已經(jīng)提交的快照(和 reset 重置到某個(gè)指定版本不一樣),。它是在提交記錄最后面加上一個(gè)撤銷了更改的新提交,,而不是從項(xiàng)目歷史中移除這個(gè)提交,這避免了 Git 丟失項(xiàng)目歷史,。

撤銷(revert)應(yīng)該用在你想要在項(xiàng)目歷史中移除某個(gè)提交的時(shí)候,。比如說(shuō),你在追蹤一個(gè) bug,,然后你發(fā)現(xiàn)它是由一個(gè)提交造成的,,這時(shí)候撤銷就很有用。

撤銷(revert)被設(shè)計(jì)為撤銷公共提交的安全方式,,重設(shè)(reset)被設(shè)計(jì)為重設(shè)本地更改,。

因?yàn)閮蓚€(gè)命令的目的不同,它們的實(shí)現(xiàn)也不一樣:重設(shè)完全地移除了一堆更改,,而撤銷保留了原來(lái)的更改,,用一個(gè)新的提交來(lái)實(shí)現(xiàn)撤銷。千萬(wàn)不要用 git reset 回退已經(jīng)被推送到公共倉(cāng)庫(kù)上的 提交,,它只適用于回退本地修改(從未提交到公共倉(cāng)庫(kù)中),。如果你需要修復(fù)一個(gè)公共提交,最好使用 git revert,。

發(fā)布一個(gè)提交之后,,你必須假設(shè)其他開(kāi)發(fā)者會(huì)依賴于它。移除一個(gè)其他團(tuán)隊(duì)成員在上面繼續(xù)開(kāi)發(fā)的提交在協(xié)作時(shí)會(huì)引發(fā)嚴(yán)重的問(wèn)題,。當(dāng)他們?cè)囍湍愕膫}(cāng)庫(kù)同步時(shí),,他們會(huì)發(fā)現(xiàn)項(xiàng)目歷史的一部分突然消失了。一旦你在重設(shè)之后又增加了新的提交,,Git 會(huì)認(rèn)為你的本地歷史已經(jīng)和 origin/master 分叉了,,同步你的倉(cāng)庫(kù)時(shí)的合并提交(merge commit)會(huì)使你的同事困惑。

cherry-pick

將指定的提交 commit 應(yīng)用于當(dāng)前分支(可以用于恢復(fù)不小心撤銷(revert/reset)的提交)

$ git cherry-pick <commit_id>
$ git cherry-pick <commit_id> <commit_id>
$ git cherry-pick <commit_id>^..<commit_id>復(fù)制代碼

git submodule 子模塊

有種情況我們經(jīng)常會(huì)遇到:某個(gè)工作中的項(xiàng)目需要包含并使用另一個(gè)項(xiàng)目,。也許是第三方庫(kù),,或者你獨(dú)立開(kāi)發(fā)的,用于多個(gè)父項(xiàng)目的庫(kù),。 現(xiàn)在問(wèn)題來(lái)了:你想要把它們當(dāng)做兩個(gè)獨(dú)立的項(xiàng)目,,同時(shí)又想在一個(gè)項(xiàng)目中使用另一個(gè)。如果將另外一個(gè)項(xiàng)目中的代碼復(fù)制到自己的項(xiàng)目中,,那么你做的任何自定義修改都會(huì)使合并上游的改動(dòng)變得困難,。Git 通過(guò)子模塊來(lái)解決這個(gè)問(wèn)題,,允許你將一個(gè) Git 倉(cāng)庫(kù)作為另一個(gè) Git 倉(cāng)庫(kù)的子目錄,。 它能讓你將另一個(gè)倉(cāng)庫(kù)克隆到自己的項(xiàng)目中,同時(shí)還保持提交的獨(dú)立,。

# 在主項(xiàng)目中添加子項(xiàng)目,,URL 為子模塊的路徑,,path 為該子模塊存儲(chǔ)的目錄路徑
git submodule add [URL] [Path]

# 克隆含有子項(xiàng)目的主項(xiàng)目
git clone [URL]
# 當(dāng)你在克隆這樣的項(xiàng)目時(shí),默認(rèn)會(huì)包含該子項(xiàng)目的目錄,,但該目錄中還沒(méi)有任何文件
# 初始化本地配置文件
git submodule init
# 從當(dāng)前項(xiàng)目中抓取所有數(shù)據(jù)并檢出父項(xiàng)目中列出的合適的提交
git submodule update
# 等價(jià)于 git submodule init && git submodule update
git submodule update --init

# 自動(dòng)初始化并更新倉(cāng)庫(kù)中的每一個(gè)子模塊,, 包括可能存在的嵌套子模塊
git clone --recurse-submodules [URL]復(fù)制代碼

新建一個(gè) Git 項(xiàng)目的兩種方式

1.本地新建好 Git 項(xiàng)目,然后關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)

# 初始化一個(gè)Git倉(cāng)庫(kù)
$ git init 
# 關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)
$ git remote add <name> <git-repo-url>  
# 例如
$ git remote add origin https://github.com/xxxxxx復(fù)制代碼

2.clone 遠(yuǎn)程倉(cāng)庫(kù)

# 新建好遠(yuǎn)程倉(cāng)庫(kù),,然后 clone 到本地
$ git clone <git-repo-url>

# 將遠(yuǎn)程倉(cāng)庫(kù)下載到(當(dāng)前 git bash 啟動(dòng)位置下面的)指定文件中,,如果沒(méi)有會(huì)自動(dòng)生成
$ git clone <git-repo-url> <project-name>復(fù)制代碼

Git 分支管理規(guī)范

blog.csdn.net/LitongZero/…

/post/5b4328…

  • 實(shí)際開(kāi)發(fā)的時(shí)候,一人一條分支(個(gè)人見(jiàn)解:除非是大項(xiàng)目,,參與的開(kāi)發(fā)人員很多時(shí),,可以采用 feature 分支,否則一般的項(xiàng)目中,,一個(gè)開(kāi)發(fā)者一條分支夠用了),。除此之外還要有一條 develop 開(kāi)發(fā)分支,一條 test 測(cè)試分支,,一條 release 預(yù)發(fā)布分支,。

    • develop:開(kāi)發(fā)分支,開(kāi)發(fā)人員每天都需要拉取/提交最新代碼的分支,;

    • test:測(cè)試分支,,開(kāi)發(fā)人員開(kāi)發(fā)完并自測(cè)通過(guò)后,發(fā)布到測(cè)試環(huán)境的分支,;

    • release:預(yù)發(fā)布分支,,測(cè)試環(huán)境測(cè)試通過(guò)后,將測(cè)試分支的代碼發(fā)布到預(yù)發(fā)環(huán)境的分支(這個(gè)得看公司支不支持預(yù)發(fā)環(huán)境,,沒(méi)有的話就可以不采用這條分支),;

    • master:線上分支,預(yù)發(fā)環(huán)境測(cè)試通過(guò)后,,運(yùn)營(yíng)/測(cè)試會(huì)將此分支代碼發(fā)布到線上環(huán)境,;

  • 大致流程:

    • 開(kāi)發(fā)人員每天都需要拉取/提交最新的代碼到 develop 分支;

    • 開(kāi)發(fā)人員開(kāi)發(fā)完畢,,開(kāi)始 集成測(cè)試,,測(cè)試無(wú)誤后提交到 test 分支并發(fā)布到測(cè)試環(huán)境,交由測(cè)試人員測(cè)試,;

    • 測(cè)試環(huán)境通過(guò)后,,發(fā)布到 release 分支 上,進(jìn)行預(yù)發(fā)環(huán)境測(cè)試,;

    • 預(yù)發(fā)環(huán)境通過(guò)后,,發(fā)布到 master 分支上并打上標(biāo)簽(tag);

    • 如果線上分支出了 bug ,,這時(shí)候相關(guān)開(kāi)發(fā)者應(yīng)該基于預(yù)發(fā)布分支(沒(méi)有預(yù)發(fā)環(huán)境,,就使用 master 分支),,新建一個(gè) bug 分支用來(lái)臨時(shí)解決 bug ,處理完后申請(qǐng)合并到 預(yù)發(fā)布 分支,。這樣做的好處就是:不會(huì)影響正在開(kāi)發(fā)中的功能,。

預(yù)發(fā)布環(huán)境的作用: 預(yù)發(fā)布環(huán)境是正式發(fā)布前最后一次測(cè)試。因?yàn)樵谏贁?shù)情況下即使預(yù)發(fā)布通過(guò)了,,都不能保證正式生產(chǎn)環(huán)境可以100%不出問(wèn)題,;預(yù)發(fā)布環(huán)境的配置,數(shù)據(jù)庫(kù)等都是跟線上一樣,;有些公司的預(yù)發(fā)布環(huán)境數(shù)據(jù)庫(kù)是連接線上環(huán)境,,有些公司預(yù)發(fā)布環(huán)境是單獨(dú)的數(shù)據(jù)庫(kù);如果不設(shè)預(yù)發(fā)布環(huán)境,,如果開(kāi)發(fā)合并代碼有問(wèn)題,,會(huì)直接將問(wèn)題發(fā)布到線上,增加維護(hù)的成本,。

Git 鉤子

  • Git 基本已經(jīng)成為項(xiàng)目開(kāi)發(fā)中默認(rèn)的版本管理軟件,,在使用 Git 的項(xiàng)目中,我們可以為項(xiàng)目設(shè)置 Git Hooks 來(lái)幫我們?cè)谔峤淮a的各個(gè)階段做一些代碼檢查等工作

  • 鉤子(Hooks) 都被存儲(chǔ)在 Git 目錄下的 hooks 子目錄中,。 也就是絕大部分項(xiàng)目中的 .git/hook 目錄

  • 鉤子分為兩大類,,客戶端的和服務(wù)器端的

    • 客戶端鉤子主要被提交和合并這樣的操作所調(diào)用

    • 而服務(wù)器端鉤子作用于接收被推送的提交這樣的聯(lián)網(wǎng)操作,這里主要介紹客戶端鉤子

4.1 pre-commit

  • pre-commit 就是在代碼提交之前做些東西,,比如代碼打包,,代碼檢測(cè),稱之為鉤子(hook)

  • 在 commit 之前執(zhí)行一個(gè)函數(shù)(callback),。這個(gè)函數(shù)成功執(zhí)行完之后,,再繼續(xù) commit,但是失敗之后就阻止 commit

  • 在 .git->hooks->下面有個(gè) pre-commit.sample* ,,這個(gè)里面就是默認(rèn)的函數(shù)(腳本)樣本

4.2 安裝 pre-commit

npm install pre-commit --save-dev復(fù)制代碼

4.3 配置腳本

如果沒(méi)有在 .git->hooks 目錄下生成 pre-commit 文件的話,,則要手工創(chuàng)建 node ./node_modules/pre-commit/install.js

"scripts": {
    "build": "tsc",
    "eslint": "eslint src --ext .ts",
    "eslint:fix": "eslint src --ext .ts --fix"
  },
 //在提交代碼之前,先執(zhí)行 scripts 中的 eslint 命令 
  "pre-commit": [
    "eslint"
  ]復(fù)制代碼

4.4 跳過(guò) pre-commit 繼續(xù)提交代碼

# 跳過(guò)驗(yàn)證$ git commit --no-verify$ git commit -n復(fù)制代碼

更多鉤子:/book/zh/v2/…

常見(jiàn)問(wèn)題

1,、拉取別人的遠(yuǎn)程分支合并后,,git 會(huì)存取這個(gè)拉取的記錄,如果你不小心刪了別人的上傳的文件,,這時(shí)候想要再拉取別人的分支是沒(méi)用的,,會(huì)顯示 already-up

這時(shí)候可以回滾代碼,重新拉取,。

2,、以前有過(guò)這樣的經(jīng)歷:前后端、客戶端的代碼都存放在一個(gè) git 倉(cāng)庫(kù)中,在根目錄下各自新建項(xiàng)目目錄,。那么可以直接在自己的項(xiàng)目目錄下使用 git 提交代碼并且在各自的項(xiàng)目目錄下配置 .gitignore 文件,,不用在根目錄下配置 .gitignore 文件,,這樣就互不影響了

3,、fatal:refusing to merge unrelated histories 拒絕合并不相關(guān)的歷史

在 git 2.9.2 之后,不可以合并沒(méi)有相同結(jié)點(diǎn)的分支(分支之間自倉(cāng)庫(kù)建立后,,從來(lái)沒(méi)有過(guò)互相拉取合并),。如果需要合并兩個(gè)不同結(jié)點(diǎn)的分支,如下:

$ git pull origin branchName --allow-unrelated-histories
$ git merge branchName --allow-unrelated-histories復(fù)制代碼

這個(gè)功能是可以讓大家不要把倉(cāng)庫(kù)上傳錯(cuò)了,,如果會(huì)加上這個(gè)代碼,,那么就是自己確定了上傳。舊版本的 Git 很容易就把代碼傳錯(cuò)了,,現(xiàn)在可以看到,,如果上傳的不是之前的,那么就需要加代碼上傳,。 正常情況下,,都是先建立倉(cāng)庫(kù),然后切多個(gè)分支,,分支先去拉取合并主分支的內(nèi)容,,然后再各自開(kāi)發(fā), 如果建立倉(cāng)庫(kù)后,,各個(gè)分支沒(méi)有區(qū)拉取主分支的代碼,,之后各個(gè)分支之間想要合并時(shí)就會(huì)報(bào)錯(cuò)。

4,、合并分支時(shí)出現(xiàn)問(wèn)題,,想要解除合并狀態(tài)

error: merge is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.復(fù)制代碼

當(dāng)遠(yuǎn)程分支和本地分支發(fā)生沖突后,git 保持合并狀態(tài),,你如果沒(méi)有去解決完所有的沖突,,那么 git 會(huì)一直保持這個(gè)狀態(tài),你就無(wú)法再提交代碼,。只有先解除合并狀態(tài)后,,才能繼續(xù)提交。執(zhí)行命令前最好先備份一下,,有可能本地做的修改會(huì)被遠(yuǎn)程分支覆蓋掉,。

# 解除合并狀態(tài)
$ git merge --abort 
復(fù)制代碼

5、不小心把某些文件上傳到遠(yuǎn)程 git 倉(cāng)庫(kù)/想要?jiǎng)h除遠(yuǎn)程倉(cāng)庫(kù)中的文件

# 刪除暫存區(qū)和工作區(qū)的文件
$ git rm filename  
# 只刪除暫存區(qū)的文件,,不會(huì)刪除工作區(qū)的文件
$ git rm --cached filename 
復(fù)制代碼

如果在配置 .gitignore 文件之前就把某個(gè)文件上傳到遠(yuǎn)程倉(cāng)庫(kù)了,,這時(shí)候想把遠(yuǎn)程倉(cāng)庫(kù)中的該文件刪除,此時(shí)你配置 .gitignore 文件也沒(méi)有用,因?yàn)樵撐募呀?jīng)被追蹤了,,但又不想在本地刪除該文件后再重新提交到遠(yuǎn)程倉(cāng)庫(kù),,這時(shí)候可以使用 git rm --cached filename 命令取消該文件的追蹤,這樣下次提交的時(shí)候,,git 就不會(huì)再提交這個(gè)文件,,從而遠(yuǎn)程倉(cāng)庫(kù)的該文件也會(huì)被刪除

6、將本地新建的項(xiàng)目上傳到新建的遠(yuǎn)程倉(cāng)庫(kù)上

之前沒(méi)有進(jìn)行過(guò)關(guān)聯(lián),,即沒(méi)有通過(guò) clone 遠(yuǎn)程項(xiàng)目到本地再開(kāi)始做項(xiàng)目,,而是先本地新建了一個(gè)項(xiàng)目,然后想傳到遠(yuǎn)程倉(cāng)庫(kù)上,。

# 將本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)關(guān)聯(lián)起來(lái)
$ git remote add origin 遠(yuǎn)程倉(cāng)庫(kù)地址
# 將本地的 master 分支推送到 origin 主機(jī),,同時(shí)指定 origin 為默認(rèn)主機(jī)
$ git push -u origin master
# 上面的命名執(zhí)行后,下次再?gòu)谋镜貛?kù)上傳內(nèi)容的時(shí)候只需下面這樣就可以了
$ git push復(fù)制代碼

7,、HEAD 指針既可以指向分支(默認(rèn)指向當(dāng)前分支),,也可以指向快照,當(dāng)指向的是快照時(shí),,這個(gè)時(shí)候指針的狀態(tài)稱之為游離狀態(tài)(detached)

8,、創(chuàng)建與合并分支的原理

www./wiki/896043…

9、每次 git push 都要輸入用戶名,、密碼

  • step 1:生成公鑰

ssh-keygen -t rsa -C "[email protected]"  
# Generating public/private rsa key pair...
# 三次回車即可生成 ssh key復(fù)制代碼
  • step 2:查看已生成的公鑰

cat ~/.ssh/id_rsa.pub復(fù)制代碼
  • step3:復(fù)制已生成的公鑰添加到 git 服務(wù)器

 

image.png

 

測(cè)試 ssh 是否能夠連接成功

$ ssh -T [email protected]復(fù)制代碼
  • step4:使用 ssh 協(xié)議 clone 遠(yuǎn)程倉(cāng)庫(kù) 或者 如果已經(jīng)用 https 協(xié)議 clone 到本地了,,那么就重新設(shè)置遠(yuǎn)程倉(cāng)庫(kù)

 

image.png

 

使用 ssh 協(xié)議

$ git remote set-url origin [email protected]:xxx/xxx.git復(fù)制代碼
  • step5:創(chuàng)建文件存儲(chǔ)用戶名和密碼

一般為 C:\users\Administrator,也可以是你自己創(chuàng)建的系統(tǒng)用戶名目錄,,文件名為 .git-credentials,。由于在 Windows 中不允許直接創(chuàng)建以 "." 開(kāi)頭的文件,所以用命令行創(chuàng)建該文件,。

$ touch .git-credentials
$ echo "http://{username}:{password}@github.com" >> ~/.git-credentials 
$ git config --global credential.helper store復(fù)制代碼

10,、git 不允許提交空文件夾

可以在當(dāng)前目錄下,添加一個(gè) .gitkeep 文件

11,、有時(shí)候復(fù)制過(guò)來(lái)的文件,,使用 git add . 無(wú)法進(jìn)行文件追蹤,可以使用 git add -A ,,這也就是每次提交前都要 git status 的原因

12,、同一臺(tái)電腦配置多個(gè) git 賬號(hào)

github.com/jawil/notes…

13、Another git process seems to be running in this repository, e.g.

 

image.png

 

原因在于 Git 在使用過(guò)程中遭遇了奔潰,,部分被上鎖資源沒(méi)有被釋放導(dǎo)致的,。

解決方案: 進(jìn)入項(xiàng)目文件夾下的 .git 文件中(顯示隱藏文件夾或 rm .git/index.lock)刪除 index.lock 文件即可。

14,、git commit -am "xxx" 有時(shí)候會(huì)失效,,無(wú)法提交所有的修改

git commit -am "xxx" 只會(huì)將被 tracked 的文件添加到暫存區(qū)并提交,,而將文件添加到 git 管理是要使用 git add 命令,將新的文件 tracked ,。(新建了文件之后,idea 會(huì)提示你是否需要加到 git 管理中,。選擇記住后,,之后 idea 默認(rèn)都會(huì)把新建的文件 tracked 化)

15、git merge --no-ff 的作用

  • 禁止快進(jìn)式(fast-forward)合并,,會(huì)生成一個(gè)新的提交

 

image.png

 

從合并后的代碼來(lái)看,,結(jié)果都是一樣的,,區(qū)別就在于 --no-ff 會(huì)讓 git 生成一個(gè)新的提交對(duì)象,。為什么要這樣?通常我們把 master 作為主分支,,上面存放的都是比較穩(wěn)定的代碼,,提交頻率也很低,而 feature 是用來(lái)開(kāi)發(fā)特性的,,上面會(huì)存在許多零碎的提交,,快進(jìn)式合并會(huì)把 feature 的提交歷史混入到 master 中,攪亂 master 的提交歷史,。所以如果你根本不在意提交歷史,,也不愛(ài)管 master 干不干凈,那么 --no-ff 其實(shí)沒(méi)什么用,。

segmentfault.com/q/101000000…

16,、git merge 與 git rebase 的區(qū)別

/post/5a5438…

blog.csdn.net/liuxiaoheng…

segmentfault.com/a/119000001…

segmentfault.com/a/119000001…

17、git log 無(wú)法正常顯示中文

# 試試
$ git -c core.pager=more log
# 如果可以顯示中文的話,,把 pager 設(shè)置為 more
$ git config --global core.pager more復(fù)制代碼

www.zhihu.com/question/57…

www./2019031901.…

18,、git merge -m "xxx" 的時(shí)候可以附加信息

  • 默認(rèn)是 Merge branch branchName

 

image.png

 

19、git pull 會(huì)拉取所有遠(yuǎn)程分支的代碼到本地鏡像倉(cāng)庫(kù)中

想要 merge 別人的分支時(shí):

  • 如果你的本地倉(cāng)庫(kù)中已經(jīng)有了他人的分支(直接切換到他人分支,,就會(huì)在本地生成一條他人的分支),,就可以使用 merge branchname;

  • 如果你的本地倉(cāng)庫(kù)沒(méi)有他人的分支,,那么就得使用 merge origin/branchname 來(lái)合并

 

image.png

 

20,、git branch -r/-a/-l 查看的都是本地鏡像倉(cāng)庫(kù)中的分支,如果本地鏡像倉(cāng)庫(kù)沒(méi)有拉取遠(yuǎn)程倉(cāng)庫(kù)的代碼,,此時(shí)別人新推了一個(gè)分支到遠(yuǎn)程倉(cāng)庫(kù),,你這時(shí)候是查看不到這條新推的分支的

21、git stash 存儲(chǔ)未追蹤的文件

  • 如果我們新建了文件,,但是沒(méi)有用 git add . 追蹤文件,,那么 git stash 是無(wú)法存儲(chǔ)的

$ git stash -u復(fù)制代碼

22,、如何在 github 上 pr 項(xiàng)目

segmentfault.com/a/119000002…

23、git push 無(wú)法提交代碼

可能出現(xiàn)的報(bào)錯(cuò):

  • remote: Permission to xxxxx.git denied to xxx. fatal: unable to access 'github.com/ xxxxx.git/': The requested URL returned error: 403

  • remote: You do not have permission to push to the repository via HTTPS

    fatal: Authentication failed for '/xxx.git/'

# 查看當(dāng)前項(xiàng)目的 git 配置
$ cat .git/config復(fù)制代碼
  • 查看本地項(xiàng)目的 .git/config 設(shè)置的倉(cāng)庫(kù) url 地址和 github 使用的鏈接地址是否一致,。git push 的數(shù)據(jù)協(xié)議有兩種方式:ssh 和 https,。如果不一致就需要切換 url 地址。

 

image.png

 

24,、git 輸錯(cuò)用戶名和密碼,,后續(xù)的 git 操作一直報(bào)錯(cuò)

remote: Coding 提示: Authentication failed.
remote: 認(rèn)證失敗,請(qǐng)確認(rèn)您輸入了正確的賬號(hào)密碼,。
fatal: Authentication failed for 'https://e./xxx.git/'復(fù)制代碼

在控制面板里找到憑據(jù)管理器,,選中 Windows 憑據(jù),找到 git 的憑據(jù),,點(diǎn)擊編輯,,輸入所用 github 的正確用戶名和密碼。

 

image.png

 

25,、lint-staged 失敗

 

 

可能你的項(xiàng)目名路徑中包含了中文名,,需要替換成英文名

26、查看 git 安裝目錄

  • Mac: 在命令行中輸入 which git,,就會(huì)顯示 git 的安裝位置了

  • Windows: 打開(kāi)cmd,,輸入 where git,就會(huì)顯示 git 的安裝路徑了

27,、Git中用vim打開(kāi),、修改、保存文件

28,、windows10 無(wú)法編輯 vimrc

29,、Windows下Git Bash中VIM打開(kāi)文件中文亂碼

30、如何修改舊的 commit 的 message/如何將多個(gè) commit 合成一個(gè) commit/如何將多個(gè)間隔的 commit 合成一個(gè) commit/

git rebase -i復(fù)制代碼

31,、如果兩個(gè)人都對(duì)某個(gè)文件進(jìn)行了修改,,一個(gè)是重命名文件,一個(gè)是修改文件內(nèi)容,,那么會(huì)起沖突嗎,?git 很智能,會(huì)自動(dòng)合并這些修改

如果兩個(gè)人都對(duì)同一個(gè)文件重命名,,此時(shí)會(huì)起沖突,,git 不會(huì)自動(dòng)處理,需要開(kāi)發(fā)者自身去解決沖突

32,、git revert 失?。篹rror: Commit faulty merge is a merge but no -m option was given、error: option `mainline' expects a number greater than zero

segmentfault.com/a/119000001…

www.jianshu.com/p/3719dae37…

git revert -m 1 
復(fù)制代碼

33,、git 創(chuàng)建一個(gè)空的分支

在 Git 中創(chuàng)建分支,,是必須有一個(gè)父節(jié)點(diǎn)的,,也就是說(shuō)必須在已有的分支上來(lái)創(chuàng)建新的分支,如果工程已經(jīng)進(jìn)行了一段時(shí)間,,這個(gè)時(shí)候是無(wú)法創(chuàng)建空分支的,。但是有時(shí)候就是需要?jiǎng)?chuàng)建一個(gè)空白的分支。

$ git checkout --orphan emptyBranchName復(fù)制代碼

該命令會(huì)生成一個(gè)叫 emptybranch 的分支,,該分支會(huì)包含父分支的所有文件,。但新的分支不會(huì)指向任何以前的提交,就是它沒(méi)有歷史,,如果你提交當(dāng)前內(nèi)容,,那么這次提交就是這個(gè)分支的首次提交。

想要空分支,,所以需要把當(dāng)前內(nèi)容全部刪除,,用 git 命令

$ git rm -rf . // 注意:最后的'.’不能少。復(fù)制代碼

34,、如何清空一個(gè)分支的所有提交

先刪除該分支,,然后再新建一個(gè)空的分支(分支名就是刪除的分支名)~~
以上的都會(huì)了嗎?

本文的文字及圖片來(lái)源于網(wǎng)絡(luò)加上自己的想法,僅供學(xué)習(xí),、交流使用,不具有任何商業(yè)用途,版權(quán)歸原作者所有,如有問(wèn)題請(qǐng)及時(shí)聯(lián)系我們以作處理

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多