在windows 下使用git
首先安装好在windows下的linux模拟交互器
这里我选择的是cygwin
这里我是参考:http://book.51cto.com/art/201107/278731.htm
这里还要注意我这里用的是内网,况且我用的是域名访问,所以这里每台使用的电脑都需要在自己的机器上做接下
vim /etc/hosts(这一步在cygwin 安装之后执行,有了cygwin太方便了,然后你可以使用scp 把公钥给传给服务器)
安装 Cygwin
Cygwin 的安装非常简单,先在其官方网站 http://www.cygwin.com/下载安装程序—一个只有几百KB的setup.exe文件,然后即可开始安装。
安装过程中会让用户选择安装模式:通过网络安装、下载后安装或者通过本地软件包缓存(安装时自动在本地目录下建立的软件包缓存)安装。
在安装的时候,把需要的安装包尽量都给他按了,我记得的是我装了有git,openssh,vim上面有一个搜索框,输入git,在Devel 下面有,把哪些
对应的skip 的给他去掉。
安装完成之后我们需要给其配置公钥
比如说: ssh-keygen -t rsa -C "admin@example.com"
然后拷贝公钥到gitlab 服务器上,在gitlab服务器上,选择“个人资料设置”———》“SSH密钥”————》“把刚刚产生的id.rsa.pub拷贝到上面”
然后再本地创建一个目录作为自己的“本地版本库”,把自己的本地版本库和远程服务器的版本库关联起来
git init
git remote add origin git@192.168.220.99:root/fortune.git
还有就是我之前在测试的时候遇到很多错误,到最后的时候git push 的时候还是报错
$ git push origin master
To git@git.yizhen.com:root/fortune.git
! [rejected] master -> master (non-fast-forward)
error: 无法推送一些引用到 'git@git.yizhen.com:root/fortune.git'
提示:更新被拒绝,因为您当前分支的最新提交落后于其对应的远程分支。
提示:再次推送前,先与远程变更合并(如 'git pull ...')。详见
提示:'git push --help' 中的 'Note about fast-forwards' 小节。
这时候需要执行
git pull origin master
(这时候会出来一个问你合并的理由,你自己看着写)
#git pull origin master master
然后再git push 就好了
现在我们来说一下git的分支(这里是完全按照http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840038939c291467cc7c747b1810aab2fb8863508000做的笔记)
一般我们默认的情况下,我们当前的分支都是master
1.现在我们来创建一下分支
git checkout -b dev
这个意思就是说我们创建一个dev分支,并且由当前的master分支切换到dev分支上(这里加上"-b"这个参数了,这里如果我们想只创建dev这个分支,但是并不想切换过去,执行 git branch dev就行了),现在我们可以查看一下当前的分支是哪个
git branch
我们会看到当前的分支是指向在dev分支上的(分支前面有一个“*”号,同时分支名也是高亮显示的)
这时候如果我们进行提交的话,状态就会变成下面这个样子
意思也就是说我现在所有的代码都是在dev分支上面执行的,我们之前的额master分支上面的内容没有变(意思就是说,我现在在分支dev分支上的所有操作,其他人是看不见的,这个只是属于我的,除非我和master分支合并。)
说到这,所以这里我们就是要合并了,合并完成之后,删除dev分支。然后状态就会变成下面这个样子了
具体方法:
举例说:
我们现在 git checkout -b dev
然后我们在 dev 分支上创建一个readme文件,文件内容为“hello dev”
但是这里我们需要提交
git add readme
git commit -m "add readme"
如果不执行这两句,当我们切换到别的分支的时候,我们是可以看见当前目录下面的内容的,但是如果我们执行的话,我们切换到别的分支的后,是看不见刚刚创建的文件的
这时候我么切换到master分支上 git checkout master
然后我们合并一下dd分支,
git merge dd
这样我们就能看到刚刚在dd分支上创建的文件了
这时候我们执行git branch -d dd 删除dd这个分支
总结一下 分支命令:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
现在我么来说一下解决git的冲突问题
比方说我们现在有两个分支dev分支和master分支
git checkout dev
vim readme
内容为“111111111”
然后:
git add readme
git commit -m "check readme 11111"
然后再切换到master分支上
git checkout master
vim readme
内容为“2222222222222”
然后:
git add readme
git commit -m "checkout readme 22222"
也就是说我们现在在两个分支上都对readme 文件做了修改,而且修改的内容不同,这时候我们进行合并
git merge dev
这时候会报错
自动合并readme
冲突(内容): 合并冲突于readme ,合并失败,需要进行手动修改之后再提交才行
这时候我们执行git status
会提示 双方修改了readme文件
这时候我们 vim readme
打开后会显示出
<<<<<<< HEAD
111111111
=======
2222222222222
>>>>>>> dev
会显示出来两个分支到底哪里不同,然后根据你的需要进行修改就好了
然后我们执行
git add readme
git commit -m "Bingo"
这里我们可以使用下面这个命令查看分支的合并情况
git log --graph --pretty=oneline --abbrev-commit
这时候我们可以删除dev分支了
使用git log --graph 可以查看整个的合并分支的详细情况
现在来说一下分支的管理策略:
在我们工作的时候,一般合并分支,git 通常会使用Fast forward的模式,但是在这种模式情况下,在我们删除分支后,会丢失分支的信息
所以这样我们使用 git merge --no-ff -m "add XXXXX" dev 来合并分支,git在merge的时候会创建一个新的commit,这样在分支的历史上就可以看出分支的信息
语法和 git merge dev 一样
这里我们这样
vim readme
git add readme
git commit -m "check readme"
git checkout master
git merge --no-ff -m "merge --no-ff" dev
这里说一下,我们在平常的开发过程中的分支策略:
在这里的master分支是非常稳定的,所以这里我们只用来新版本的发布,平时不在上面干活。
我们平时在 dev分支上干活,所有的小伙伴都有自己的分支,然后小伙伴每次往dev分支上合并就行了。所以平时的工作情况就是这样的
下面要说的是BUG分支:
在我们的日常开发工作中是会经常遇到BUG的,这个时候git的作用就大了。比如说这时候有一个BUG,但是你现在正在你自己的分支上干活,这时候要求你去修复BUG,但是你手头的工作没有做完,这个时候你又不能commit提交,所以这个时候git提供了一个新功能就是,保存你现在的工作现场(冻结工作现场,保证你可以永远年轻啊,哈哈哈哈哈)
这时候我们执行
git stash (冻结现场)
现在我们去修复BUG,大胆一点,直接在master分支上修改,修改完成之后
git add
git commit
现在我们再checkout到dev分支上,继续自己的工作。
这个时候我们执行git status查看一下状态,发现是干净的,因为现场被冻结了。
我们使用 git stash list 可以看见git把我的工作现场给保存在一个黑暗的小角落里了
我们去拯救他把,恢复工作现场,有两种方法
(1)git stash apply,然后执行 git stash drop来删除stash 的内容
(2)git stash pop(一般我们选择这个方式)
这个时候我们用git status 就会看到你想看的了
现在我们在远程仓库添加一个dev分支
然后再本地也添加一个dev分支
在本地的dev分支上创建文件,然后就开始
git add
git commit
我在执行git push origin dev 的时候报错,
无法推送一些引用到 'git@git.yizhen.com:root/esbtest.git'
提示:更新被拒绝,因为远程仓库包含您本地尚不存在的提交。这通常是因为另外
提示:一个仓库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更
提示:(如 'git pull ...')。
让我执行git pull origin dev
然后再执行git push origin dev 就行了
但是正常的情况下都是可以的(应该是我前面那个地方做错了)
下面说一下多人协作:
下面内容摘自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013760174128707b935b0be6fc4fc6ace66c4f15618f8d000
和前面一样,每个人都从远程的dev分支上clone 一个仓库到自己的电脑本地,完工后在push到远程的分支
其实在我们clone 远程分支的时候,我们的dev分支已经和远程的dev分支关联起来了。git remote add
我们可以使用 git remote -v 查看远程仓库额详细信息
如果你没有push 的权限的话,你是看不到push 的地址的。
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
-
master
分支是主分支,因此要时刻与远程同步; -
dev
分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步; -
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
-
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!
抓取分支:
现在比如说遇到一个情况就是现在有两个人都对dev分支上的文件进行了修改,研发A已经把本地的dev分支上的内容推送到远程仓库了。好了,现在你也要推送你修改的文件到远程的dev分支上,但是你的提交和你小伙伴的提交有冲突,这个时候他会提示你,把他的最新提交给pull 下来,就是我们前面遇到的问题
Git已经提示我们,先用git pull
把最新的提交从origin/dev
抓下来,然后,在本地合并,解决冲突,再推送:
git pull
也失败了,原因是没有指定本地dev
分支与远程origin/dev
分支的链接,根据提示,设置dev
和origin/dev
的链接:
$ git branch --set-upstream dev origin/dev
再次执行 pull
git pull
git pull 成功,但是我们合并的时候会报错,这个时候就需要手动去解决你的冲突了。可能是你们两个人修改了同一个文件,但是修改的内容不一样,这时候你们两个就要商量一下了,到底谁是对的,修改冲突的地方,修改完成之后
就
git commit -m "XXXXXXXX"
git push
多人协作的工作模式通常是这样:
-
首先,可以试图用
git push origin branch-name
推送自己的修改; -
如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; -
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用
git push origin branch-name
推送就能成功!
如果git pull
提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
小结
-
查看远程库信息,使用
git remote -v
; -
本地新建的分支如果不推送到远程,对其他人就是不可见的;
-
从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交; -
在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致; -
建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
; -
从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突。
下面说一下标签管理:
这里的标签的意思就是:
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。
标签的意思是:
“我要找commit id是892b892a3f7...的那个版本”
“一串乱七八糟的数字怎么找?”
“我要找的commit id是打了标签(tag) “v1.1”的那个版本”
“找到了:git show v1.1”
下面说一下创建标签:
直接执行git tag v1.2
然后执行git tag 查看当前有哪些标签
当然我们还可以给历史的commit 打上标签
首先我们使用
git log --pretty=oneline --abbrev-commit
查看到历史的commit id然后使用git tag v3.4
6224937
(这个是id号)这里的标签不是按照时间顺序排的,而是按照字母顺序排的。可以使用 git show <tagname>查看标签的详细信息
创建带有说明的标签
git tag -a v3.5 -m "XXXXXX" commit_id
如果标签打错了,可以删除
git tag -d <tagname>
推送某个标签到远程
git push origin v3.4
git push origin --tags 推送所有的标签
若果要删除远程的标签就:
先删除本机的标签
然后删除远程的
git push origin :refs/tags/v3.4
下面说一下git的一些小技巧
比如说有的命令比较难记,这时候我们可以给他起一个别名
git config -- global alias.st status
上面的git st 就是代表git status 了