git常用技能整理
优先参考官方的文档(推荐的资料)
https://git-scm.com/book/zh/v2
新进入一个gitlab库需要增加ssh
Clone
git clone gitUrl (前端项目一般接下来先要npm install)
新建并切换到该分支
git checkout -b 分支名如daily/0.0.1
如果是从远程仓库拉取特定的分支:
git clone -b 远程分支名
如果是从某个分支上生成开发分支 dev/… 注意本地需要新建立一个分支比如 dev 然后从dev上去push到 origin的dev/…上 不要直接在dailly/… 下写然后push到 dev/. 上
master上pull(从远端更新)最新代码 必须先切换分支到master
git checkout master 再pull远端代码到当前分支上
git pull gitUrl (pull完之后也需要在npm install一下,使用tnpm下载和更新模块回更快,链接http://web.npm.alibaba-inc.com/)
之前clone的代码无论是主分支还是某个分支只需要
git pull
(有更改每天都pull一下,保持所拉取的代码为最新) 相当于 git fetch + git merge
从指定分支拉取代码到本地指定分支(常用!)
git pull origin 远程分支:本地某分支
指定本地分支提交和更新的远程代码分支:
(特别是本地分支有多人合作开发,要从远程某分支先pull,那么必须先指定upstream,否则git bash里会显示不了文字,其实没有pull,也引文落后于远程分支而不能push,建议git bash出现空行的时候,换个命令行工具)
git branch --set-upstream-to=origin/someBranch daily/0.0.30
分支重命名
本地分支 git branch -m oldname newname
提交代码(需要先合并master)
提交之前先要切回master分支 git pull一下 (必须切到master下pull然后切到自己的分支上merge master之后再build,再git status(build下不一样可以git add .) 再 push)
要合并哪个分支的代码,必须切到该分支下 去 pull
然后回到要发布的目录: git merge master (把master目录合并到当前目录)
如果merge master时遇到:
fatal: refusing to merge unrelated histories
是不同项目历史的原因,在当前分枝下执行:
git pull origin master --allow-unrelated-histories
具体原因参考:http://blog.csdn.net/lindexi_gd/article/details/52554159
日常发布
功能在本地开发好之后,就可以通过如下命令进行编译,提交到日常了:
... build
git add . (git发明了一个叫做暂存区的概念,conmit之前要add一下) (如果删除过某文件 还要执行git rm 文件路径)
git commit -m 'dev' (提交当前工作空间的修改内容提交的时候必须用-m来输入一条提交信息,如’dev’) (在push之前先切换到master版本 git pull一下,如果有更新就切回分支把master合并过来,分析清楚冲突之后再 push)
git push origin daily/x.x.x:daily/x.x.x (git push:将本地commit的代码更新到远程版本库中,例如'git push origin b1:b2'就会将本地名为b1的代码更新到名为b2的远程版本库中, 第一次写daily/x.x.x:daily/x.x.x,以后只需要写一个,否则会覆盖远程分支)
发布至线上
开发分支在日常测试完成之后发布至线上:
git tag publish/x.x.x
git push origin publish/x.x.x:publish/x.x.x
一般提交前先pull再build
git push到远程日常时,第一次写daily/x.x.x:daily/x.x.x,以后只需要写一个,否则会覆盖远程分支
git stash(存储目前状态,可不提交后切换分支)
你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。
“‘储藏”“可以获取你工作目录的中间状态 切换到另一分支,pull, 再切回原来分支,git stash pop回到上次stash前,也就是修改了的最后状态 Merge 刚才pull的分支
https://git-scm.com/book/zh/v1/Git-%E5%B7%A5%E5%85%B7-%E5%82%A8%E8%97%8F%EF%BC%88Stashing%EF%BC%89
撤销更改
git status 的时候报 Changes not staged for commit
按提示,要么使用
git add/rm 文件路径
添加或删除 commit的内容,要么就:
git checkout -- 文件路径
丢弃做的某些改动。
这样再次commit的时候提示的红字就会消失。
具体参考: https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%92%A4%E6%B6%88%E6%93%8D%E4%BD%9C
强制提交代码到远程分支(如果冲突以本地代码为准,只适用于分支是自己一人用的情况)
git push origin HEAD --force
自己已经发布的版本更新到远端
需要先指定本地分支提交和更新的远程代码分支:
git branch --set-upstream-to=origin/someBranch daily/0.0.30
如:
git branch --set-upstream-to=origin/daily/0.1.3 daily/0.1.3
然后就只需要 git push origin daily/x.x.x(远程仓库的号) 就行了
如果 后面在跟一个分支的话,就是把当前目录的分支创建并作为远端的后者分支, 后面那个分支如果之前存在回删掉覆盖
git commit –am
git commit -am "
**(某种程度上git commit –am 相当于git add和git commit -m的组合技
,建议使用此命令来提交)**
**注意: 如果出现nothing added to commit but untracked files present (use "git add" to track)
用git add . + git commit -m '' 可以解决**
冲突解决
如果出现冲突,要找到位置之后再app目录下 上面的是自己的分支,下面是要提交的分支,把上面的内容加到下面之后只保留下面(master)的,,
然后 Git merge 之后(git status没有问题之后)
git commit –m ‘dev’ (如果冲突时是无关紧要的构建文件的话可以 git add . 然后 git commit –m ‘dev’ 之后点:wq之后再git merge 主分支)
再git push
参考: http://www.cnblogs.com/sinojelly/archive/2011/08/07/2130172.html
MERGE_MSG.swp" already exists问题
Swap file ".git/.MERGE_MSG.swp" already exists! [O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)born:
解决方法:
找到".git/.MERGE_MSG.swp",之后删除即可,然后重新git add .; git commit -m "";git push master 之后,再执行 git merge branchName 就好啦
Git pull强制覆盖掉本地文件(常用!)
如强行本地master分支与远程master一致
git fetch --all
git reset --hard origin/master
git 分支后面的 数字意思
+a ~b –c 代表相比远程分支 增加a 修改b 删除c个文件,需要 git status 查看具体信息
Git参考
http://www.cnblogs.com/eddy-he/archive/2012/03/29/branch.html
http://wlog.cn/soft/git-quick-start.html
仓库地址如果变化,修改本地代码提交的远程仓库
git remote set-url origin
回滚
git reset –hard //回滚到 merge 前的版本,回滚一版
git reset --hard HEAD~2 // 取消当前版本之前的两次提交
git代码库回滚 参考
http://www.cnblogs.com/qualitysong/archive/2012/11/27/2791486.html
删除
删除分枝
git branch -D 分枝名
(-d 只有在合并完成后才能删除, -D 则是强制删除)
打tag和删除tag
列显已有的标签
列出现有标签的命令非常简单,直接运行 git tag 即可
删除本地tag
比如tag是v1.0.0
git tag -d v1.0.0
删除远程tag
git push origin :refs/tags/v1.0.0