现在随着git的优势展现,公司几乎都抛弃了svn而使用git作为版本控制工具,那么咱们就来聊聊git操作的方法。
此篇文章根据自己想法,比较随心所欲,想到哪里写到哪里,但也不是随便写,根据自己在工作中的一些用法来记录一下。
一、要了解git就要先了解几个概念 工作目录(work tree) 本地仓库(local repository) 暂存区域 (index)
工作目录: 就是你可以使用git操作的命令,比如git checkout啦,暂时可以理解为当前目录下有.git文件夹的目录
暂存区域: 所谓的暂存区域只不过是个简单的文件,一般都放在 Git 目录中。有时候人们会把这个文件叫做索引文件(index),不过标准说法还是叫暂存区域。
本地仓库: 就是把暂存区域里面的文件提交到git能够管理的和追踪的仓库里面
二、git 分为客户端和服务器端
首先,从远程仓库上拉取代码
(1)创建工作目录,并在此目录下使用git bash here 命令行工具
git clone --bare ××××××××××××××.git -b branch(分支) 或者
git clone ××××××××××××××.git -b branch(分支)
这二个命令是有区别的。第一个命令是创建了一个裸仓库(没有工作区,没有工作区还有一个好处就是空间占用小)
第二个命令是创建一个对等工作区(和远程的仓库的备份,目录都一样,所以我们使用此命令来拉取代码)
(2)拉取远程仓库更新过的代码和自己更新的文件提交到远程仓库
1、使用git命令配置远程仓库 (git remote add <主机名> <网址>)
git remote add origin ××××××××××××××.git
2、git查看本地分支和远程分支
git branch //查看本地分支
git branch -a //查看远程分支
git branch test //创建本地分支
git checkout test //切换到分支
3、同步代码(git pull <远程主机名> <远程分支名>:<本地分支名>)
eg:取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。
git pull origin next:master
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git pull origin next
4、提交代码(git push 命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相仿;git push <远程主机名> <本地分支名>:<远程分支名>)
注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。
如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push。
git push -u origin master
5、提交修改文件到本地仓库(git commit 主要是将暂存区里的改动给提交到本地的版本库。git commit - m "描述")
git add .(把本地仓库中所有文件添加到版本库)
git commit - m "" //提交到本地仓库
git commit -am "提交描述"(此命令等价于上面的2条命令效果)
git remote add origin ××××××××××××××.git //配置远程仓库
git push -u origin branch(分支名)
6、git合并分支
可以切换分支,但是我们本地默认分支就是stockout
git pull //拉取代码
git add . //把本地修改提交暂存区
git commit -m "bug修改" //提交本地代码到stockout
git checkout devlop //切换到devlop分支
git merge stockout //把stockout分支合到devlop分支上
修改远程仓库的地址
git remote set-url origin url
如果远程仓库已经有代码了
$ git push
To ../remote/
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to '../remote/'
问题 (Non-fast-forward) 的出现原因在于: git remote 仓库中已经有一部分代码, 所以它不允许你直接把你的代码覆盖上去. 于是你有 2 个选择方式:
(1)强推, 即利用强覆盖方式用你本地的代码替代 git 仓库内的内容
git push -f
(2) 或者先把 git 的东西 fetch 到你本地然后 merge 后再 push
git fetch
git merge
7、对git冲突的解决
首先来看一下一则错误信息:
error: You have not concluded your merge (MERGE_HEAD exists).
要了解错误信息,首先要了解git fetch 和 git pull的区别
git fetch origin master //表示从远程master上拉取最新代码,但是不合并到本地master
git log -p master..origin/master //比较本地的master分支和origin/master分支的区别
git merge origin/master //合并远程分支到本地
git pull origin master //相当于进行了 git fetch 和 git merge两部操作
再说导致报错:error: You have not concluded your merge (MERGE_HEAD exists).
的原因可能是在以前pull下来的代码自动合并失败
解决办法一:保留本地的更改,中止合并->重新合并->重新拉取
git merge --abort //中止合并
git reset --merge //git reset 表示回到合并之前的状态
git pull
解决办法二:舍弃本地代码,远端版本覆盖本地版本(慎重)
git fetch --all
git reset --hard origin/master
git fetch
对于git reset 命令的使用,回退版本
git reset (–mixed) HEAD~1
回退一个版本,且会将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态,不影响原来本地文件(未提交的也
不受影响)
git reset –soft HEAD~1
回退一个版本,不清空暂存区,将已提交的内容恢复到暂存区,不影响原来本地的文件(未提交的也不受影响)
git reset –hard HEAD~1
回退一个版本,清空暂存区,将已提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换
四、当在码云上创建仓库后,和本地代码关联后,git pull origin master 会出现
”git无法pull仓库refusing to merge unrelated histories“
合并pull两个不同的项目,出现的问题如何去解决
如果合并了两个不同的开始提交的仓库,在新的 git 会发现这两个仓库可能不是同一个,为了防止开发者上传错误,于是就给下面的提示
fatal: refusing to merge unrelated histories
如我在Github新建一个仓库,写了License,然后把本地一个写了很久仓库上传。这时会发现 github 的仓库和本地的没有一个共同的 commit 所以 git 不让提交,认为是写错了 origin ,如果开发者确定是这个 origin 就可以使用 --allow-unrelated-histories 告诉 git 自己确定
遇到无法提交的问题,一般先pull 也就是使用 git pull origin master 这里的 origin 就是仓库,而 master 就是需要上传的分支,因为两个仓库不同,发现 git 输出 refusing to merge unrelated histories 无法 pull 内容
因为他们是两个不同的项目,要把两个不同的项目合并,git需要添加一句代码,在 git pull 之后,这句代码是在git 2.9.2版本发生的,最新的版本需要添加 --allow-unrelated-histories 告诉 git 允许不相关历史合并
假如我们的源是origin,分支是master,那么我们需要这样写git pull origin master --allow-unrelated-histories 如果有设置了默认上传分支就可以用下面代码
git pull origin master --allow-unrelated-histories
git 本地修改 未add操作,恢复本地库命令
git checkout . //.表示全部
git checkout 文件名
如果已经add和commit操作
git reset 文件名
(1)如果有文件未提交,又要切换分支那就需要使用一个很重要的命令
分支切换利器,我们经常会遇到,正在一个分支上开发,写了很多东西,其中提交了一部分,一部分正在写,还没写完,这时突然来个线上问题,需要我们切换到线上分支去处理,我们怎么办,提交?还没写完,还不能通过编译,不提交,放弃?更不可能 辛苦工作一天了。这时就需要下面这个命令,特别长用
git stash 暂时将未提交的变化暂存,形成类似一个快照,然后就可以随意切换到其他分支了。
git stash pop 当在其他分支解决完问题,切换到当前分支,执行该命令,之前的暂存快照又恢复了,可以继续工作了
注意 当在不同的分支上都执行git stash时,在任何一个分支执行git stash pop有可能回覆盖当前的分支,所以不要在不同的分支同时执行git stash和git stash pop
常用git stash命令:
(1)git stash save "save message" : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。
(2)git stash list :查看stash了哪些存储
(3)git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
(4)git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p
(5)git stash apply :应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}
(6)git stash pop :命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}
(7)git stash drop stash@{$num} :丢弃stash@{$num}存储,从列表中删除这个存储
(8)git stash clear :
删除所有缓存的stash
git 删除本地分支的命令:
git 在删除分支的时候可以使用git branch -d featurename 也可以是git branch -D featurename
其中是有区别的
git branch -d 的时候如果本地分支没有被合并就会提示这个问题
git branch -D 是强制删除,所以直接执行 强制删除就好了。
要删除远程分支如下:
git push origin --delete featurename
git版本回滚
在当前分支上执行:git log 获取版本号。
git reset --hard 版本号
git push -f origin 远程分支