若是本地沒有代碼,首先須要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
首先切換到要push代碼的本地分支上,而後git push origin <遠程分支>
在本分支下直接git pull拉取對應遠程分支。git
3.git add . git commit -m '完成功能'後 push前 撤銷commit,但保留以前的修改github
別人的方法,嘗試了沒效果:web
git log
找到你想撤銷的commit_id
2. git reset --hard commit_id
完成撤銷,同時將代碼恢復到前一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
feature/creditsCountSetting該分支下有沒有merge好的代碼因此作了提示,-D就是強制刪除分支
如今的開發模式是隻能從develop代碼到本地,不能push到develop,新建功能或者修復bug都須要新建一個分支,而後push本身的分支到gitlab,而後發起merge request給同事,然他們review並merge到develop分支,那麼就存在一個問題,直接merge到develop分支的話有可能會衝突,因此在push本身的分支前必定要拉取develop代碼到本身的分支,在本地解決衝突,
也就是 git pull origin develop
由於拉取遠端的分支到當前的分支,因此冒號後面的參數就省略了
git pull命令
相似於下面
conventional-changelog 就是生成 Change log 的工具,運行下面的命令便可
Commit message 和 Change log 編寫指南
commitlint
一個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
git remote -v
能夠查看本地倉庫關聯了幾個遠端倉庫
git remote add gitee https://gitee.com/balibabu/apollo-linter.git
git push -u gitee develop:master
,不加上develop分支的話,push不了git cherry -v //查看本地已經commit,但未push的版本 git show xxxxx_version_id //查看版本中的具體代碼
git add 之後每每切換分支的時候是切換不了的,那麼就能夠運行git stash暫存代碼,git stash list
查看暫存代碼記錄,而後找到對應版本git stash apply stash@{1}
撤銷暫存
新建文件的時候發現git stash 並不起做用,那麼怎麼辦呢?原來暫存分爲兩種狀況:
git stash save -u
orgit stash save --include-untracked
git stash和git stash pop
git stash 暫存當前修改
你可能不知道的關於 Git stash 的技巧
建立本地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
就好了。
同理能夠切換代碼到歷史某次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
常常在公司和家裏辦公,提交代碼到一個倉庫,可是出現commit username不一樣的狀況,那麼須要在本倉庫設置username和email
1.設置本倉庫
git config user.name "" git config user.email ""
3.切回master 再新建bill分支 新建logo.txt 執行 git rebase develop
對比兩圖能夠發現,在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 -igit rebase -i
能夠將多個commit合併爲一個commit
You have not concluded your merge (MERGE_HEAD exists) 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自動部署前端代碼就用到了公鑰
對於已經commit但沒push的代碼的回退每每就須要reset進行操做
reset中三種方式的區別mixed soft hard
git reset 三種用法總結
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 優雅的撤銷中間某次提交
開始文件名叫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 默認對文件名大小寫不敏感 (不區分文件名大小寫)
git remote set-url origin git@github.com:xxx/xxxx.git git remote -v // 查看遠程倉庫地址
git rm -r --cached . git add . git commit -m 'update .gitignore'
Git中.gitignore文件不起做用的解決以及Git中的忽略規則介紹
git pull
直接拉去遠端到本地,若是本地和遠端分支沒有創建關係,可使用git pull origin master
使用origin制定遠端分支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
git fetch & git pull
Git fetch & pull 詳解
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操做,
git revert [merge前一條commit id]
會將本身分支寫的代丟失掉git revert -m 1 [merge 的那一條commit id]
這個時候會回退到merge以前本身分支的代碼對於被tracked文件能夠不用git add . 直接這麼提交
可是對於新建的文件必須先git add .
而後commit
git 不區分文件名大小寫, 沒法檢測到差別, 致使文件內容的差別push成功
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 checkout -- text.md
rm filename / rm -rf dir
, 全部文件/文件夾:git clean -xdf
git reset放棄修改&放棄增長文件指出可使用git clean -xdf
,可是執行了發現不但新增的文件被刪除了,並且node_modules目錄也被刪了,因此慎用