Git入门使用说明
1.Git简介
Git是目前世界上最先进的分布式版本控制系统(没有之一)。同类软件CVS和SVN的集中式版本控制系统,有两大弊端:1.必须联网才能工作,受到网络限制;2.安全性不行,集中式版本控制系统的版本库集中存放在中央服务器里,一旦中央服务器出了问题,所有人都没法干活。Git管理能力强,能够记录每次文件的改动,并且每次改动标识明确,便于追踪历史文件。如下图所示:
2.Git安装
在Mac OS X上安装Git
就是直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”--------->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
3.创建版本库
版本库说白了就是一个目录,只是里面的文件都会被Git管理,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
创建一个版本库非常简单,选择一个合适地方,创建一个空目录
pwd命令用于显示当前目录。
第二步,通过git init命令把该目录变成Git可以管理的仓库
4.Git 基本操作
4.1 添加文件
添加文件到Git仓库,分两步:
第一步,使用命令git add ,可反复多次使用,添加多个文件;
第二步,使用命令git commit,完成提交到本地仓库。
4.2 常用命令
1.git status:时刻掌握仓库当前的状态。
2.git diff: 查看修改的内容。
3.git log: 显示从最近到最远的提交日志。
4.git reset --hard HEAD^: 回退到上一个版本。
5.git reset --hard HEAD^^: 回退到上上个版本。
6.git reset --hard HEAD~100:回退到上100个版本。
7.git reflog: 查看命令历史, 以便确定要回到未来的哪个版本。
8. git checkout :把文件在工作区的修改全部撤销(还没有commit),用版本库里的版本替换工作区的版本(已经commit)。
9. git reset HEAD file: 可以把file暂存区的修改撤销掉。
10.git rm:用于删除一个文件,提交后不再跟踪该文件记录
4.3 工作区和寄存区
工作区指的是我们电脑里能看到的目录。隐藏目录.git(在创建的版本库目录里,默认隐藏) 就是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
5 远程仓库
5.1创建远程仓库
我们已经学会在本地创建仓库,但Git是分布式版本控制系统,我们只要在GitHub注册一个账号,就可以免费获得Git远程仓库。步骤如下:
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
ssh-keygen -t rsa -C "liaogs@fise.com.cn"
使用可视化管理工具等同于下面
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。点“Add Key”,你就应该看到已经添加的Key。
这样,我们的远程仓库就建好了,任何人都可以看到(只有你自己可以改)。
5.2 本地关联远程库
远程库我们已经建好了,现在,我们根据GitHub的提示,在本地仓库下运行命令:
请千万注意,把上面的michaelliao替换成你自己的GitHub账户名。远程库的名字默认为origin。
下一步,就可以把本地库的所有内容推送到远程库上:
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样。
从现在起,只要本地作了提交,就可以通过命令:
把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!
5.3 从远程库克隆
我们在GitHub上建好远程库后,就可以着手从远程库克隆。
使用git clone命令克隆一个本地库
注意把Git库的地址换成你自己的。这样就行了。如果是多个人协作开发,那么每个人各自从远程克隆一份就可以了。
6 分支管理
6.1创建与合并分支
其实Git默认建立了一个分支master,这个分支叫主分支,它是指向提交的,HEAD是指向master的
每次提交,master分支都会向前移动一步。
首先,我们创建dev分支,然后切换到dev分支:
然后,用git branch命令查看当前分支:
git branch命令会列出所有分支,当前分支前面会标一个*号。
我们修改文件并提交,然后,我们切换回master分支
切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变
现在,我们把dev分支的工作成果合并到master分支上
git merge命令用于合并指定分支到当前分支。合并后,再查看修改文件的内容,就可以看到,和dev分支的最新提交是完全一样的。
合并完成后,就可以放心地删除dev分支了:
6.2 解决冲突
有时候当前分支修改的文档提交的内容与多一个提交点的另一个分支内容冲突,我们需要修改内容重新提交。
6.3 bug分支
当我们在一个分支上进行工作,但要处理另一个分支上的bug时,
Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
这时候我们可以放心的处理bug了,等我们处理完bug ,我们要查看“储藏”的内容在哪?可以使用命令git stash list查看
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;另一种方式是用git stash pop,恢复的同时把stash内容也删了;
再用git stash list查看,就看不到任何stash内容了。
你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
6.4开发新feature
开发一个新feature,最好新建一个分支;如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。
6.5 多人协作
多人协作时,大家都会往master和dev分支上推送各自的修改。当你的小伙伴想要从远程库clone时,默认情况下,他只能看到本地master分支。现在,你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:
现在,他可以在dev继续修改,并时不时push推送到远程。
这时候你也做了同样的修改并试图推送。这时候,Git会显示push失败,因为提交有冲突。
解决方案:
先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送。
如果git pull失败,原因是没有实现本地dev与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
7 常用命令
git clone |
git add |
git diff |
git fetch |
git show |
git merge |
git log |
git apply |
git reset |
git rebase |
git branch |
git rm |
git push |
git stash |
git tag |
git checkout |
git status |
git pull |
git remote |
git archive |
版本冲突
1.pull会使用git merge导致冲突,需要将冲突的文件resolve掉 git add -u, git commit之后才能成功pull.
2.如果想放弃本地的文件修改,可以使用git reset --hard FETCH_HEAD,FETCH_HEAD表示上一次成功git pull之后形成的commit点。然后git pull.
第1个问题: 解决GIT代码仓库不同步
今天在执行git pull时出现:
- [root@gitserver /data/work/www/rest/lib/Business/Inventory]# git pull
- Enter passphrase for key '/root/.ssh/id_rsa':
- Updating 70e8b93..a0f1a6c
- error: Your local changes to the following files would be overwritten by merge:
- rest/lib/Business/Inventory/ProductStatus.php
- Please, commit your changes or stash them before you can merge.
- Aborting
解决方法:
执行git checkout -f,然后再执行git pull重新checkout
- [root@gitserver /data/work/www/rest/lib/Business/Inventory]# git checkout -f
- Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
再执行git pull时就可以了:
- [root@gitserver /data/work/www/rest/lib/Business/Inventory]# git pull
- Enter passphrase for key '/root/.ssh/id_rsa':
- Updating 70e8b93..a0f1a6c
- Fast-forward
- rest/lib/Business/Inventory/ProductStatus.php | 1 +
- 1 files changed, 1 insertions(+), 0 deletions(-)
- mode change 100644 => 100755 rest/lib/Business/Inventory/ProductStatus.php
第2个问题: git pull的默认地址问题.
1.git处于master这个branch下时,默认的remote就是origin;
2.当在master这个brach下使用指定remote和merge的git
pull时,使用默认的remote和merge。
但是对于自己建的项目,并用push到远程服务器上,并没有这块内容,需要自己配置。
如果直接运行git pull,会得到如此结果:
#当执行git pull之后的提示:
- $ git pull
- Password:
- You asked me to pull without telling me which branch you
- want to merge with, and 'branch.master.merge' in
- your configuration file does not tell me, either. Please
- specify which branch you want to use on the command line and
- try again (e.g. 'git pull ').
- See git-pull(1) for details.
- If you often merge with the same branch, you may want to
- use something like the following in your configuration file:
- [branch "master"]
- remote =
- merge =
- [remote ""]
- url =
- fetch =
- See git-config(1) for details.
#解决方法, 通过git config进行如下配置.
- git remote add -f origin git@192.168.21.44:rest.git
- git config branch.master.remote origin
- git config branch.master.merge refs/heads/master