您的位置:首页 > 其它

Git使用入门

2017-06-19 13:25 302 查看

Git使用入门

 

一.什么是Git?

Git 是 Linux 发明者
Linus 开发的一款新时代的分布式版本控制系统。

版本控制系统的作用:

1.为了防止代码的丢失,肯定本地机器与远程服务器都要存放一份,而且还需要有一套机制让本地可以跟远程同步;

2.我们经常是好几个人做同一个项目,都要对一份代码做更改,这个时候需要大家互不影响,又需要各自可以同步别人的代码;

3.我们开发的时候免不了有bug,有时候刚发布的功能就出现了严重的bug,这个时候需要紧急对代码进行还原;

4.随着我们版本迭代的功能越来越多,但是我们需要清楚的知道历史每一个版本的代码更改记录,甚至知道每个人历史提交代码的情况;

等等等类似以上的情况,这些都是版本控制系统能解决的问题。所以说,版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统,对于软件开发领域来说版本控制是最重要的一环,而 Git
毫无疑问是当下最流行、最好用的版本控制系统。

 

二.Git的安装

安装完成后,还需要最后一步设置,在命令行输入:

$ git config --global user.name "Your Name"

$ git config --global user.email "email@example.com"

 

三.Git的使用-命令行

1.目录

①$ cd——改变当前目录

例如:

$ cd E:/Git

 

②$ mkdir——在当前目录下,创建文件夹,可以用来创建版本库(仓库)英文名repository

例如:

$ mkdir gittest

cd E:/Git/gittest或cd gittest

 

③$ git rm xxx——在当前目录下,移除文件xxx。

 

④$ pwd——用于显示当前目录,(Print Working Directory显示当前路径)

例如:

$ pwd

/e/Git/gittest

 

⑤$ git init——把这个目录变成Git可以管理的仓库,仓库是gittest

例如:

git init

Initialized empty Git repository in E:/Git/gittest/.git/

 

2.提交

①$ git add XXX——添加文件XXX到缓存区

例如:

$ git add readme.txt

注:确保文件XXX在当前目录下,即在Git库里。可以是文件夹。

解释:所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等。

 

②$ git commit -m ‘xxx’——将缓存区的所有文件提交,xxx是提交的附带信息,如first commit

例如1:

$ git commit -m ‘first commit’

注:为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:

$ git add file1.txt

$ git add file2.txt file3.txt

$ git commit -m "add 3 files."

 

3.查看

①$ git status——查看状态

例如:

$ git status

On branch master

 

Initial commit

 

nothing to commit (create/copy files and use "git add" to track)

 

②$ git diff readme.txt——查看文件的修改

 

③$ git log——命令可以查看所有产生的 commit
记录


 

4.分支

branch 即分支的意思,分支的概念很重要,尤其是团队协作的时候,假设两个人都在做同一个项目,这个时候分支就是保证两人能协同合作的最大利器了。举个例子,A, B俩人都在做同一个项目,但是不同的模块,这个时候A新建了一个分支叫a,
B新建了一个分支叫b,这样A、B做的所有代码改动都各自在各自的分支,互不影响,等到俩人都把各自的模块都做完了,最后再统一把分支合并起来。

①$ git branch——查看当前分支
例如:
$ git branch
*master    //当前分支为主分支master
 
②$ git branch a——创建分支a
 
③$ git checkout a——转换到分支a
 
④$ git checkout -b a——创建分支a,并转换到分支a
 

⑤$ git branch -d a——删除分支a

 
⑥合并分支
A同学在a分支代码写的不亦乐乎,终于他的功能完工了,并且测试也都ok了,准备要上线了,这个时候就需要把他的代码合并到主分支master上来,然后发布。git
merge 就是合并分支用到的命令,针对这个情况,需要先做两步,第一步是切换到
master 分支,如果你已经在了就不用切换了,第二步执行
git merge a ,意思就是把a分支的代码合并过来,不出意外,这个时候a分支的代码就顺利合并到
master 分支来了。为什么说不出意外呢?因为这个时候可能会有冲突而合并失败,留个包袱,这个到后面进阶的时候再讲。
 

5.标签

我们在客户端开发的时候经常有版本的概念,比如v1.0、v1.1之类的,不同的版本肯定对应不同的代码,所以我一般要给我们的代码加上标签

①$ git tag——查看标签
 
②$ git tag v1.0——新建标签
 
③$ git checkout v1.0——转换标签,同时切换到
v1.0 tag的代码状态

 
④$ git tag -d v1.0——删除标签
注:新建标签要在commit之后,这个标签就是这次提交文件的代码标签。
 

6.添加远程库,Pull&Push

你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。

1.关联GitHub的仓库
①转换到本地仓库目录下
$ cd E:/Git/gittest
②将本地仓库关联到GitHub仓库,注:仓库可以有多个,所以要注明是哪一个仓库。
$ git remote add origin git@github.com:wulinbanxia/仓库名.git
注:remote远距离的,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
 
2.Pull,把远程最新的代码更新到本地。
一般我们在 push
之前都会先 pull ,这样不容易冲突。格式如下:
 $ git pull origin master
注1:从git2.9开始merge和pull的命令默认是不允许两个不相关历史的分支合并。上述写法会报错:fatal:
refusing to merge unrelated histories(拒绝合并不相关历史)
解决方法:添加参数--allow-unrelated-histories做强制合并。如下:
 $ git pull origin master --allow-unrelated-histories
注2:强制合并后会出现以下对话框

git 在pull或者合并分支的时候有时会遇到这个界面(请输入提交消息来解释为什么这种合并是必要的)。
可以不管(直接下面3,4步),如果要输入解释的话就需要:
1.按键盘字母 i
进入insert模式
2.修改最上面那行黄色合并信息,可以不修改
3.按键盘左上角"Esc"
4.输入":wq",注意是冒号+wq,按回车键即可
 
3.Push,将本地库的内容推送到远程。
 $ git push origin master
 
4.Clone,从远程库克隆
当我们没建本地库,建立了远程库时,可以把远程库克隆到本地。
①确定克隆到本地的目录,比如克隆到e:/Git/GR
$ cd e:/Git/GR
②克隆远程库
$ git clone git@github.com:wulinbanxia/CSS_task1.git
结果我们发现,在e:/Git/GR下,多出一个CSS_task1文件夹,里面是远程库内容。
 

7.git进阶

1撤销命令,将文件撤销到上次commit状态。
$ git checkout a.md
注:checkout 命令只能撤销还没有
add 进暂存区的文件。
 
2暂存命令stash
设想一个场景,假设我们正在一个新的分支做新的功能,这个时候突然有一个紧急的bug需要修复,而且修复完之后需要立即发布。当然你说我先把刚写的一点代码进行提交不就行了么?这样理论上当然是ok的,但是这会产品垃圾commit,原则上我们每次的commit都要有实际的意义,你的代码只是刚写了一半,还没有什么实际的意义是不建议就这样commit的,那么有没有一种比较好的办法,可以让我暂时切到别的分支,修复完bug再切回来,而且代码也能保留的呢?

①把当前分支所有没有 commit
的代码先暂存起来

$ git stash
注1:前提是我们的代码没有进行 commit ,即使 add 也没关系,对象是当前分支所有代码。
注2:结果是执行 git status 你会发现当前分支很干净,几乎看不到任何改动,你的代码改动也看不见了,但其实是暂存起来了。
②查看暂存区stash记录
$ git stash list
结果:你会发现此时暂存区已经有了一条记录。
③这个时候你可以切换会其他分支

赶紧把bug修复好,然后发布。之后一切都解决了,你再切换回来继续做你之前没做完的功能,但是之前的代码怎么还原呢?

④还原暂存区的代码
$ git stash apply
结果:会发现你之前的代码全部又回来了,就好像一切都没发生过一样。
⑤删除暂存区的这次 stash 记录
$ git stash drop
结果:就把最近一条的 stash 记录删除了。
⑥代替apply和drop
$ git stash pop
注:pop 不但会帮你把代码还原(apply),还自动帮你把这条 stash 记录删除(drop)
最后还有一个命令介绍下:
⑦清空所有暂存区的记录
$ git stash clear
注1:clear清空所有暂存区的记录,而drop只删除一条。
注2:drop后面可以跟 stash_id 参数来删除指定的某条记录,不跟参数就是删除最近的。
 
3合并命令 merge & rebase
①我们在一个 featureA
分支开发完了一个功能,这个时候需要合并到主分支 master 上去,我们只需要进行如下操作:
$ git checkout master
$ git merge featureA
②其实 rebase 命令也是合并的意思,上面的需求我们一样可以如下操作:
$ git checkout master
$ git rebase featureA
注:rebase 跟 merge 的区别你们可以理解成有两个书架,你需要把两个书架的书整理到一起去,第一种做法是 merge ,比较粗鲁暴力,就直接腾出一块地方把另一个书架的书全部放进去,虽然暴力,但是这种做法你可以知道哪些书是来自另一个书架的;第二种做法就是 rebase ,他会把两个书架的书先进行比较,按照购书的时间来给他重新排序,然后重新放置好,这样做的好处就是合并之后的书架看起来很有逻辑,但是你很难清晰的知道哪些书来自哪个书架的。
 

8.版本回退

$ git log——查看从最近到最远的提交日志
$ git log
commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Tue Aug 20 15:11:49 2013 +0800
 
    append GPL
 
commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Tue Aug 20 14:53:12 2013 +0800
 
    add distributed
 
commit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Mon Aug 19 17:51:55 2013 +0800
 
    wrote a readme file
注:需要友情提示的是,你看到的一大串类似3628164...882e1e0的是commit id(版本号)
 
②$ git reset——版本回退
$ git reset --hard HEAD^
$ git reset --hard 3628164
注1:在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
注2:可以使用commit id(版本号)达到同样效果
 
③恢复到新版本
当回退到上一个版本之后,最新的版本$ git log已经看不到了,若想回到最新版本,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append
GPL的commit id是3628164...,于是就可以了:
$ git reset --hard 3628164
HEAD is now at 3628164 append GPL
若关闭了命令行窗口,使用$ git reflog用来查看你的每一次命令
$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file
第二行显示append GPL的commit id是3628164,现在,你又可以回到最新版本了。
$ git reset --hard 3628164
HEAD is now at 3628164 append GPL
 

9.配置别名

$ git config --global alias.st status   
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
另外这里给大家推荐一个很强大的 alias
命令,我们知道我们输入 git log 查看日志的时候是类似这样的:



输入git log –graph
–pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’
–abbrev-commit –date=relative 然后日志这样了:



配置别名如下
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"

这样以后直接输入 git lg 就行了。
 
 
 
 
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: