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目录也被删了,因此慎用

相关文章
相关标签/搜索