现在随着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 命令的使用,回退版本
合并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 当在其他分支解决完问题,切换到当前分支,执行该命令,之前的暂存快照又恢复了,可以继续工作了