git 經常使用命令

1. 拉取遠程分支到本地

若是本地沒有代碼,首先須要git clone項目到本地,此時clone下來的是master分支,而後再去拉取其餘分支,
下面是兩種方式html

1.git fetch origin <遠程分支名>:<本地分支名>
此時會在本地就有分支了,可是沒有跟遠端分支創建映射關係,也不會切換到新的分支
git fetch origin <遠程分支名> 這種方式只是從遠端拉取了分支,可是本地沒有新分支
使用 git branch -r 查看, 通常結果爲
origin/HEAD -> origin/master
origin/master
origin/<遠程分支名>前端

分支管理-多人協做

2.本地新建分支, 把此分支放入其中
git checkout -b <本地分支名> origin/<遠程分支名>
這種方式會創建映射關係vue

爲何要創建映射關係?
不創建映射關係每次push或者pull都須要指定遠端分支node

怎樣創建映射關係?
git拉取遠程分支並建立本地分支
git branch -vv查看分支的映射關係
切換到分支git branch -u origin/分支名手動創建當前分支和遠端分支的映射關係react

2. push代碼到遠程分支

首先切換到要push代碼的本地分支上,而後git push origin <遠程分支>
在本分支下直接git pull拉取對應遠程分支。git

3.git add . git commit -m '完成功能'後 push前 撤銷commit,但保留以前的修改github

別人的方法,嘗試了沒效果:web

  1. 找到上次Git commit的 id

     git log 
     找到你想撤銷的commit_id
2.  git reset --hard commit_id
      完成撤銷,同時將代碼恢復到前一commit_id 對應的版本。面試

  1. git reset commit_id 

     完成Commit命令的撤銷,可是不對代碼修改進行撤銷,能夠直接經過git commit 從新提交對本地代碼的修改。shell

後面搜到的方法,起了做用:
git reset --soft HEAD^

今天同事遇到個問題,就是有三個commit,而且已經push到了remote,須要撤銷中間的那條commit,保留第一條和第二條commit,使用reset -hard第二條commit hash後,後面的兩個commit都消失了,沒有達到想要的效果,如今就是恢復回來,那麼從遠端pull回來就能夠了,而後git revert 中間的commit hash,達到了目的,參考了git reset revert 回退回滾取消提交返回上一版本

git使用情景2:commit以後,想撤銷commit
3. git 刪除本地分支-d -D的區別

-d
-D

feature/creditsCountSetting該分支下有沒有merge好的代碼因此作了提示,-D就是強制刪除分支

4. git pull <遠程主機名> <遠程分支名>:<本地分支名>

如今的開發模式是隻能從develop代碼到本地,不能push到develop,新建功能或者修復bug都須要新建一個分支,而後push本身的分支到gitlab,而後發起merge request給同事,然他們review並merge到develop分支,那麼就存在一個問題,直接merge到develop分支的話有可能會衝突,因此在push本身的分支前必定要拉取develop代碼到本身的分支,在本地解決衝突,

  • 以前個人作法:
  1. 本身分支commit代碼
  2. 切換到develop 而後 git pull
  3. 再切換到本身的分支 執行git merge develop
  • 後來發現能夠直接在本地分支拉取遠端develop到當前的分支

也就是 git pull origin develop
由於拉取遠端的分支到當前的分支,因此冒號後面的參數就省略了

git pull命令
5. Commit message 和 Change log 自動生成markdown文件

相似於下面
image.png

conventional-changelog 就是生成 Change log 的工具,運行下面的命令便可

Commit message 和 Change log 編寫指南
commitlint

6. git cherry-pick 將特定的commit記錄合併到當前分支

一個picker分支基於develop,如今的代碼都commit在picker分支,因爲react升級到16因此又開了個分支在master分支,因此如今新建分支masterpicker基於master,而後將picker分支的一些commit合併到masterpicker,那麼就須要使用cherry-pick命令,若是直接使用git merge 那麼就會將全部的develop的代碼都合併到了masterpicker分支。
git cherry-pick 使用指南

若是你如今的工做目錄(work tree)裏搞的一團亂麻, 可是你如今尚未把它們提交; 你能夠經過下面的命令, 讓工做目錄回到上次提交時的狀態(last committed state):

$ git reset --hard HEAD

7. push本地倉庫到遠端新的倉庫

git remote -v能夠查看本地倉庫關聯了幾個遠端倉庫

  • 添加新的遠端倉庫 git remote add gitee https://gitee.com/balibabu/apollo-linter.git
  • 將develop分支推送到遠端master分支git push -u gitee develop:master,不加上develop分支的話,push不了
8. 查看本地已經commit,但未push的代碼
git cherry -v //查看本地已經commit,但未push的版本
git show xxxxx_version_id //查看版本中的具體代碼
9. git stash 暫存代碼

git add 之後每每切換分支的時候是切換不了的,那麼就能夠運行git stash暫存代碼,git stash list 查看暫存代碼記錄,而後找到對應版本git stash apply stash@{1}撤銷暫存

新建文件的時候發現git stash 並不起做用,那麼怎麼辦呢?原來暫存分爲兩種狀況:

  1. 文件已經被 git 跟蹤,只是修改了代碼(而不是新條件文件),咱們可使用 git stash 或 git stash save "註釋" 來暫存修改。
  2. 若是有新添加的文件,那麼就須要添加 -a 參數(如,git stash -a 或 git stash save -a "註釋"),或先 git add . 而後再使用 git stash 或 git stash save "註釋" 來暫存修改。再或者git stash save -u orgit stash save --include-untracked

git stash和git stash pop
git stash 暫存當前修改
你可能不知道的關於 Git stash 的技巧

10. git tag v1.0

建立本地taggit tag v1.0
將本地tag推送到遠端git push origin --tags
獲取遠端taggit fetch origin tag V1.0
刪除本地taggit tag -d V1.0
刪除遠端taggit push origin :refs/tags/V1.0
查看某個tag詳細信息git show v1.0 好比誰在何時打的tag

若是我想在某個tag上build代碼,發佈到服務器,咱們能夠切換到改tag,就拿到了對應的代碼

切換到某個taggit checkout v1.0
在從lodash master分支切換到標籤4.17.11-es的時候使用git checkout v4.17.11-es會報錯,直接用git checkout 4.17.11-es就能夠切換,很奇怪。比對下發現有些庫的tag是沒加v前綴的,因此lodash直接git checkout 4.17.11-es就好了。
git checkout v1.0

同理能夠切換代碼到歷史某次commit id
git checkout 170c521
好比懷疑當前代碼有問題,歷史某次提交多是對的,而後切換到歷史某次代碼

切換到了歷史,怎麼切換回最新的代碼?
直接git checkout master(分支名)
How to get back to most recent version in Git?

提示我代碼沒法提交,在本tag上新建個分支就能夠正常的開發了
git checkout -b <new-branch-name> <tag-name>

git 打標籤並推送tag到託管服務器
git切換到某個tag

10. git 修改用戶名 郵箱

常常在公司和家裏辦公,提交代碼到一個倉庫,可是出現commit username不一樣的狀況,那麼須要在本倉庫設置username和email

1.設置本倉庫

git config user.name ""
git config user.email ""

git修改提交做者和郵箱

11. git 修改已提交的內容

git 修改已提交的內容

12. git rebase develop
  1. 在master下新建index.html文件
  2. git checkout -b develop 新建文件file.txt

3.切回master 再新建bill分支 新建logo.txt 執行 git rebase develop

bill branch

  1. 切回master 再新建assassin分支 新建geek.txt 執行 git merge develop

assassin branch

對比兩圖能夠發現,在assassin分支有一條Merge branch 'develop' into assassin的記錄而rebase是沒這條記錄的,也就是rebase提到的若是你想讓"mywork"分支歷史看起來像沒有通過任何合併同樣,可是在develop中提交的add file.txt記錄仍是在的

固然咱們一般是pull遠端的代碼到當前的分支
git pull origin develop
git pull origin develop --rebase

簡單對比git pull和git pull --rebase的使用

在執行git pull origin develop --rebase同一個commit產生了兩條commitID,不知道是怎麼產生的,

使用git rebase合併屢次commit
聊下 git rebase -i
git rebase -i能夠將多個commit合併爲一個commit

13. You have not concluded your merge (MERGE_HEAD exists)

You have not concluded your merge (MERGE_HEAD exists) git拉取失敗

14.爲項目添加公私鑰

git 多套公、私鑰的配置以及使用

因爲運行ssh-keygen -t rsa -b 4096 -C "your_email@example.com" 的時候沒有加-b 4096後面運行ssh-add ~/.ssh/id_rsa就報錯了:Could not open a connection to your authentication agent,解決辦法,

eval `ssh-agent -s`

再次執行ssh-add ~/.ssh/id_rsa就行了

運行ssh -T git@gitee.com返回
Hi assassin! You've successfully authenticated, but Gitee.com does not provide shell access.
代表連接成功,可是我仍是無法經過ssh的方式clone代碼,會報錯:
git@gitee.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
一頭霧水,應該是我多帳號的問題,個人電腦有公司的,有本身的,因此git沒法識別,Windows下Git多帳號配置,同一電腦多個ssh-key的管理須要在.ssh目錄下新建一個config文件

# 配置gitee.com
Host gitee.com 
    HostName gitee.com
    IdentityFile C:\\Users\\lenovo\\.ssh\\gitee_rsa
    PreferredAuthentications publickey
    User username2

這樣就能夠經過ssh clone代碼了

gitee碼雲使用webhook自動部署前端代碼就用到了公鑰

15. 版本回退

  • 已push的代碼最好使用revert
  • 已commit未push的代碼使用reset

對於已經commit但沒push的代碼的回退每每就須要reset進行操做
reset中三種方式的區別mixed soft hard
git reset 三種用法總結

  • 已add到暫存區的代碼回到工做區

use "git reset HEAD <file>..." to unstage
一樣使用reset

  • 撤銷工做區的代碼

1.對於修改的文件use "git checkout -- <file>..." to discard changes in working directory
2.對於新增的文件rm filename
git放棄修改&放棄增長文件用了git clean -xdf發現新的的文件從工做區刪了,同時也把node_modules目錄刪了

git reset revert 回退回滾取消提交返回上一版本
Git恢復以前版本的兩種方法reset、revert
git 優雅的撤銷中間某次提交

16. git不區分大小寫

開始文件名叫AddUser.js,我在Windows上把文件名改爲addUser.js而後push到遠端,遠端倉庫顯示仍是AddUser.js,原來是git默認對文件大小寫也不區分,而後設置git config core.ignorecase false,push到遠端,遠端竟然有兩個文件AddUser.js和addUser.js都在,沒這讓人火大,使出第二招git rm AddUser.js發現兩個都被刪了,最後只好再次添加addUser.js,這時候只是把AddUser.js刪了,而後push就沒問題了

git 默認對文件名大小寫不敏感 (不區分文件名大小寫)
17. github 切換https到ssh
git remote set-url origin git@github.com:xxx/xxxx.git

git remote -v // 查看遠程倉庫地址

github項目切換遠程https到ssh通道

18. 已push的文件 .gitignore不起做用
git rm -r --cached .
git add .
git commit -m 'update .gitignore'

Git中.gitignore文件不起做用的解決以及Git中的忽略規則介紹

19. 在已有的分支上拉去遠端代碼 (pull fetch 的區別)
  1. 本地與遠端創建關係後,最便捷的方式是git pull直接拉去遠端到本地,若是本地和遠端分支沒有創建關係,可使用git pull origin master使用origin制定遠端分支
  2. 使用fetch 和 merge
  • 對於本地已存在的分支master

git fetch origin master
//代碼拉去到了本地,但沒有合併到master分支

git merge origin/master
//把剛纔從遠端拉取到的新代碼合併到本地master分支,若是不先fetch,執行 git merge origin/master是沒發把遠端新的代碼合併到master分支的

本地已存在的分支master,若是直接使用git fetch origin master:master,會報錯 fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository

綜上git pull 至關於git fetch + git merge

  • 對於本地不存在分支master

fetch pull 區別

git fetch & git pull
Git fetch & pull 詳解

20. 先merge 再revert到merge以前的代碼

Git如何回滾一次錯誤的合併
當你決定去 revert 一個merge commit
Git怎樣撤銷一次分支的合併Merge

今天的操做是 先merge master分支的代碼到發現有衝突 而後解決衝突,push到直接的分支 而後發個pull request而後manager merge了pull request到master,這個時候發現代碼本地分支代碼還有衝突,其實這個時候能夠git reset ,可是若是有人在manager 合併了個人pull request後,提交了新的代碼到master,那麼reset會形成別人的代碼會丟失,因此這個時候只能用revert

master 有reset操做 我bill分支merge了master分支的代碼,可是在我merge master分支以前寫了一些代碼,在merge的時候git會自動將master代碼混入到個人分支,這個時候我想保留我本地的代碼,可是又懼怕別人在後面有新的代碼push到master,若是用reset可能將別人新push的代碼去掉,因此用revert操做,

  1. 使用git revert [merge前一條commit id] 會將本身分支寫的代丟失掉
  2. 使用git revert -m 1 [merge 的那一條commit id]這個時候會回退到merge以前本身分支的代碼
21. git commit -a -m "提交信息"

對於被tracked文件能夠不用git add . 直接這麼提交

可是對於新建的文件必須先git add .而後commit

git第一次提交不能使用git commit -a -m

22. git mv -f abc.vue Abc.vue 解決大小寫不敏感問題

git 不區分文件名大小寫, 沒法檢測到差別, 致使文件內容的差別push成功

23. 工做區 暫存區 歷史記錄區之間的操做
  • 工做區到暫存區 git add text.md或者git stage text.md

其實,他們兩是同義的,因此,驚不驚喜,意不意外?這個問題居然是個陷阱…引入 git stage 的緣由其實比較有趣:是由於要跟 svn add 區分,二者的功能是徹底不同的,svn add 是將某個文件加入版本控制,而 git add 則是把某個文件加入暫存區,由於在 git 出來以前你們用 svn 比較多,因此爲了不誤導,git 引入了git stage,而後把 git diff --staged 作爲 git diff --cached 的相同命令。基於這個緣由,咱們建議使用 git stage 以及 git diff --staged。
來自面試中的那些 Git 問題 - 基礎部分

  • 暫存區撤銷到工做區 單個文件/文件夾 :git reset HEAD text.md , 全部文件/文件夾:git reset HEAD .
  • 撤銷工做區文件的修改(對於已被git追蹤的文件)git checkout -- text.md
  • 撤銷新增到工做區的文件 單個文件/文件夾::rm filename / rm -rf dir, 全部文件/文件夾:git clean -xdf

git reset放棄修改&放棄增長文件指出可使用git clean -xdf,可是執行了發現不但新增的文件被刪除了,並且node_modules目錄也被刪了,因此慎用

相關文章
相關標籤/搜索