一、新建分支
-
创建分支并切换
$ git checkout -b index-swiper
-
切换分支
$ git checkout master
-
提交代码
$ git add * $ git commit -m "message" $ git push origin index-swiper
二、删除分支(远程/本地)
-
查看所有分支(远程/本地)
$ git branch -a
-
删除本地分支
$ git branch -D <BranchName>
-
删除远程分支
$ git push origin --delete <BranchName> $ git push origin -D <BranchName>
三、合并分支
-
将
index-swiper
分支合并到master
分支$ git checkout master
-
合并
index-swiper
分支$ git merge index-swiper
-
没有冲突直接提交远程,有冲突解决需要
add、commit、push
提交$ git push origin master
四、拉取远程分支到本地
-
获取远程分支
remoteName
到本地新分支localName
,并跳到localName
分支$ git checkout origin/remoteName -b localName
-
可以把远程某各分支拉去到本地的
remoteName
下,如果没有localName
,则会在本地新建localName
$ git fetch origin remoteName:localName
五、撤销放弃本地修改
-
未使用
git add
缓存代码-
放弃指定文件修改,注意中间有
--
$ git checkout -- <filename>
-
放弃所有文件修改
$ git checkout .
-
放弃指定文件修改
$ git checkout 文件名
此命令用来放弃掉所有还没有加入到缓存区(就是
git add
命令)的修改:内容修改与整个文件删除。此命令不会删除新建的文件,因为新建的文件还没加入 git 管理系统中,所以对 git 来说是未知,只需手动删除即可。
-
-
已使用
git add
缓存代码,未使用git commit
-
放弃指定文件修改
$ git reset HEAD filename
-
放弃所有文件修改
$ git reset HEAD
此命令用来清除
git
对于文件修改的缓存。相当于撤销git add
命令所在的工作。在使用本命令后,本地的修改并不会消失,而是回到了第一步,未使用
$ git add
缓存代码,继续使用$ git checkout -- filename
,就可以放弃本地修改。
-
-
已经用
git commit
提交了代码-
回退到上一次
commit
的版本$ git reset --hard HEAD^
-
也可以通过下面的
回滚代码
$ git reset
或$ git revert
来回退。
-
-
放弃本地代码,重新从远程分支拉取代码覆盖
$ git reset --hard origin/分支名
六、回滚代码(远程/本地)
-
如果不是很会,推荐以当前分支开个新的分支来练习一下回滚,成功之后在操作正式分支,以免数据丢失!
-
命令查看
git提交历史
和<commit id>
$ git log
-
回退到上一个版本
$ git reset --hard
-
回退到本地任意
commit
版本git reset
,放弃之后提交的内容。$ git reset --hard <commit id>
-
回退本地任意
commit
版本git revert
,不会放弃之后提交的内容。$ git revert <commit id>
-
git reset
与git revert
回退的区别-
git reset
是回到指定<commit id>
版本,在这个<commit id>
之前的版本都会被保留,在<commit id>
之后修改提交的版本都会被删掉,切换之后,只要没有push
,可以通过pull
还原线上代码。 -
git revert
是通过将指定<commit id>
进行回滚,它会将指定<commit id>
这次修改的内容在当前分支上进行移除,并提交成为一个新的commit
,好处是之前所有版本都不会删除,只是多了一个新的commit
。比如提交了
10
次代码了,但是其中第5
次的提交的代码不想要了,可以通过revert
放弃这次提交的代码,5
次后续提交的不受影响,只是单纯剔除5
次的,然后生成一次新的commit
-
-
发布到远程,这里用到
--force
强制覆盖,不用有的情况会提示要git pull
代码,但是拉下来又回恢复到原样了,可以看情况是否加强制覆盖,推荐加上,反正都是想提交上去,正常覆盖跟强制覆盖结果没区别。$ git push --force origin master $ git push -f origin master
如果报错这个,是权限问题,有的分支你没有这个操作权限,可以找管理员给你发布或者给你权限
参考文章 。dengzemiaodeMacBook-Pro:vue dengzemiao$ git push -f Total 0 (delta 0), reused 0 (delta 0) remote: GitLab: You are not allowed to force push code to a protected branch on this project. To gitlab.hapi123.net:lounan/vue.git ! [remote rejected] master -> master (pre-receive hook declined) error: failed to push some refs to 'git@gitlab.hapi123.net:lounan/vue.git'
七、将 某个分支代码
完全覆盖 另外一个分支代码
-
例如:将
master
分支代码完全覆盖dev
分支,在提交远程dev
。1、首先切换到
dev
分支$ git checkout dev
2、直接拉取
远程或本地
master
分支代码覆盖dev
分支// 拉取远程 master 覆盖 dev $ git reset --hard origin/master // 拉取本地 master 覆盖 dev $ git reset --hard master
3、强制推送到远程
dev
$ git push -f origin dev
八、修改分支名称(远程/本地)
-
修改本地分支名称
$ git branch -m oldBranchName newBranchName
-
修改远程分支名称
1、先修改本地分支名称
$ git branch -m oldBranchName newBranchName
2、删除远程分支
$ git push origin --delete oldBranchName
3、提交本地修改新名称的分支
$ git push origin newBranchName
九、比较文件的不同
-
尚未缓存的改动(普通常用):
$ git diff
-
查看已缓存的改动:
$ git diff --cached
-
查看已缓存的与未缓存的所有改动:
$ git diff HEAD
-
常用的就这几项,更多的可以看看 文档
十、cherry-pick
代码回滚
-
例如:两个人进行
A
跟B
版本开发,在A
版本上线的时候,B
版本不需要上线,有一个人不小心将A
跟B
两个版本合并了,并发布到了master
分支,那么这个时候需要剔除出来B
版本的内容,就可以通过$ git cherry-pick <commit-id>
进行回滚。$ git cherry-pick <commit-id>
如果开发
B
版本的那个人在本次开发B
版本的时候提交了3
次:$ git log commit-id3 16:00 commit-id2 10:00 commit-id1 8:00
那么就需要从时间最近的
commit-id
开始回滚。例如:
$ git cherry-pick commit-id3 commit-id2 commit-id1
十一、Git 可视化
-
有时候找问题,或者查看版本文件修改,就需要用到可视化去比对,
gitk
是git
可视化工具,如果敲下面命令不生效,说明安装 Mac - git 安装 gitk(详细流程)。$ gitk
常见的疑难杂症
-
新建本地分支后将本地分支推送到远程库, 使用
git pull
或者git push
的时候报错-
错误:
dengzemiaodeMacBook-Pro:wx_announce dengzemiao$ git pull There is no tracking information for the current branch. Please specify which branch you want to merge with. See git-pull(1) for details. git pull <remote> <branch> If you wish to set tracking information for this branch you can do so with: git branch --set-upstream-to=origin/<branch> dev
-
查看本地分支和远程分支的关联关系,也就是本地分支跟踪的那一支远程分支
$ git branch -vv
通过执行命令行,输出下面的数据:
[origin/master]
里面的就是关联跟踪的远程分支
,下面就master
有添加关联跟踪,dev
分支后面没有[origin/master]
也就是需要手动添加一下关联关系dengzemiaodeMacBook-Pro:wx_announce dengzemiao$ git branch -vv 1.2.8 c184812 . * dev 2524ef2 Merge branch 'dev' of gitlab.hapi123.net:lounan/wx_announce into dev // 分支名称 提交日志ID [关联跟踪的远程分支] master e7b6e69 [origin/master: behind 3] Merge branch 'dev'
-
建立本地分支与远程分支的关联关系
$ git branch --set-upstream-to=origin/远程分支名称 本地分支名称
通过命令建立关联关系
dengzemiaodeMacBook-Pro:wx_announce dengzemiao$ git branch --set-upstream-to=origin/dev dev Branch 'dev' set up to track remote branch 'dev' from 'origin'.
再次查看关联关系,现在
dev
分支后面就有[origin/dev]
了,也就是关联成功远程分支了,现在就可以在提交本地分支的时候直接使用git pull
或者git push
了。dengzemiaodeMacBook-Pro:wx_announce dengzemiao$ git branch -vv 1.2.8 c184812 . * dev 2524ef2 [origin/dev] Merge branch 'dev' of gitlab.hapi123.net:lounan/wx_announce into dev master e7b6e69 [origin/master: behind 3] Merge branch 'dev'
-
-
Updates were rejected because the tip of your current branch is behind