一、新建分支
-
创建分支并切换
$ 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 dev2、直接拉取
远程或本地master分支代码覆盖dev分支// 拉取远程 master 覆盖 dev $ git reset --hard origin/master // 拉取本地 master 覆盖 dev $ git reset --hard master3、强制推送到远程
dev$ git push -f origin dev
八、修改分支名称(远程/本地)
-
修改本地分支名称
$ git branch -m oldBranchName newBranchName -
修改远程分支名称
1、先修改本地分支名称
$ git branch -m oldBranchName newBranchName2、删除远程分支
$ git push origin --delete oldBranchName3、提交本地修改新名称的分支
$ 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