初识git
作者:bin因为之前一直使用svn,所以在学习git时,难免会拿来对比
一、在Linux下创建git仓库
1.创建版本库(如果不指定~/gitrepos,将会以当前目录为库,类似svnadmin create ):
git init ~/gitrepos
2.添加文件入版本库, 类似svn add
cd ~/gitrepos git add test.txt
3.再创建一个目录(程序员A),作为开发目录
mkdir ~/gitworkA chmod 777 ~/gitworkA
4.在开发目录检出, 类似svn co
cd ~/gitworkA git clone ~/gitrepos
5.这时在~/gitworkA目录你会看到刚才添加的test.txt。我们编辑一下,然后再使用下面的命令提交上去
git add test.txt //将修改的内容提交到"本地缓存区" git commit -m'add test.txt' //将"本地缓存区"内容提交到"本地库(程序员A)" git push origin //将内容提交到远程(这里即~/gitrepos) 库中
这里要注意git与svn 不同,git 每个(程序员A、B、C)都是一个库,svn 则依赖于同一个库。
6.这时我们发现~/gitrepos库中文件并没有修改,但使用git status -s,发现文件被修改了,我们可以使用
git stash //缓存当前的目录文件,并且将目录至更新最新的库(刚才A提交的) git stash clear // 清空无用的缓存(这里的目的就是要更新A提交的文件)
二、冲突解决
上面的操作基本完成了,git库创建->代码检出->修改代码->提交,
接下来梳理一下代码冲突导致的提交失败,如何解决
场景再现:B更改了test.txt,但是A也改了,并且A先提交了(即B修改的文件不是最新的),B再提交就会出现如下一大段文字
此时我们只要关注红框中 ()内的内容,即fetch first
svn 出现文件冲突第一想到:自己的文件是不是最新的(执行svn up)?
在git中,我们使用
git fetch origin git merge origin
或者 (pull即上面2个方法的合并)
git pull origin
此时会出现,我们只需要关注红框中的冲突文件即可(图中为blogbak.sh)
然后查看当前目录文件状态
git status -s
会出现
UU test.txt
查看 test.txt内容,其中
1:自己(即B程序员) 修改的 <<<<<<< HEAD 修改内容 =======
2:~/gitrepos中的修改(即A程序员刚才提交的) ======= 修改内容 >>>>>>>
编辑文件,确认修改正确之后使用下面的命令进行提交即可
git add test.txt git add commit -m'fix conflict in text.txt' git push origin
这样冲突就解决了
最后,强烈建议提交文件前自己先diff一下,确认没有问题,再提交(●’◡’●)
git diff test.txt
并且时常更新代码,保持同步,避免大量浪费时间在解决冲突文件中
git pull origin
三、如何打tag与推送至远程服务器
1、列出标签tags
git tag
2、打tag,为当前版本添加标签
$ git tag -a v0.1 -m “v0.1版本”
3、为已经commit的记录打tag(9fbc3d0为 git log –oneline中的值)
$ git tag -a v0.1 9fbc3d0
4、删除标签tag
$ git tag -d v0.1
5、将tag推送至远程服务器
$ git push ssh master v0.1 # 将v0.1.2标签推送 $ git push ssh master --tags # 将本地所有标签全部推送 $ git push ssh master :v20170514-add-process-func #将删除的tag-release推送至服务器
6、拉取服务器上的tag,并切换至tag
$ git pull ssh $ git checkout v0.1
7、找回误删文件
在git status -s中显示D的文件,可以通过以下方式找回
$ git checkout -- test.txt
四、其他使用技巧
8、清空本地修改
$ git checkout .
9、生成git登陆ssh key
$ cd ~/.ssh $ ssh-keygen -t rsa -C “email@email.com”
10、删除远程分支
git push [远程名] :[分支名]
git push origin :serverfix