在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

git-br-initial

1.现在我们来创建一下分支

git checkout -b dev

这个意思就是说我们创建一个dev分支,并且由当前的master分支切换到dev分支上(这里加上"-b"这个参数了,这里如果我们想只创建dev这个分支,但是并不想切换过去,执行  git   branch  dev就行了),现在我们可以查看一下当前的分支是哪个

git branch

我们会看到当前的分支是指向在dev分支上的(分支前面有一个“*”号,同时分支名也是高亮显示的)

这时候如果我们进行提交的话,状态就会变成下面这个样子

git-br-dev-fd

意思也就是说我现在所有的代码都是在dev分支上面执行的,我们之前的额master分支上面的内容没有变(意思就是说,我现在在分支dev分支上的所有操作,其他人是看不见的,这个只是属于我的,除非我和master分支合并。)

说到这,所以这里我们就是要合并了,合并完成之后,删除dev分支。然后状态就会变成下面这个样子了

git-br-rm

具体方法:

举例说:
我们现在   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分支上合并就行了。所以平时的工作情况就是这样的

git-br-policy

 

下面要说的是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分支的链接,根据提示,设置devorigin/dev的链接:

$ git branch --set-upstream dev origin/dev
再次执行 pull
git pull
git pull 成功,但是我们合并的时候会报错,这个时候就需要手动去解决你的冲突了。可能是你们两个人修改了同一个文件,但是修改的内容不一样,这时候你们两个就要商量一下了,到底谁是对的,修改冲突的地方,修改完成之后

git commit -m "XXXXXXXX"
git push

多人协作的工作模式通常是这样:

  1. 首先,可以试图用git push origin branch-name推送自己的修改;

  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

  3. 如果合并有冲突,则解决冲突,并在本地提交;

  4. 没有冲突或者解决掉冲突后,再用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  了

 

 

posted @ 2016-05-20 14:00  BigBao的博客  阅读(2645)  评论(0编辑  收藏  举报