Git的基本使用
关于Git官网提供的《pro git》应该是最全面,最权威的使用手册了。关于Git的具体概念,来源,使用等都可以去里查阅学习。本文的目的是从零开始以演示Git在实际项目中的一些基本应用,以帮助读者快速上手。
本文默认读者数量使用window系统且对命令行操作有一定了解。
要完成的文章内容:
- Git的安装
- Git本地仓库的建立
- Git克隆,拉取,合并,推送
- Git分支创建,分支之间的合并
- Git远程仓库,远程分支拉去,本地和远程的对应关系,本地与远程的对应关系绑定
- 笔记里面其他的关于Git命令
- git stash 保存修改的东西到缓存,然后拉去代码之后再把缓存的东西释放出来
Git安装
在Linux上安装
如果要在 Linux 上安装预编译好的 Git 二进制安装包,可以直接用系统提供的包管理工具。在 Fedora 上用 yum 安装:
$ yum install git-core
在 Ubuntu 这类 Debian 体系的系统上,可以用 apt-get 安装:
$ apt-get install git
在Mac上安装
在 Mac 上安装 Git 有两种方式。最容易的当属使用图形化的 Git 安装工具,界面如图 1-7,下载地址在:
http://sourceforge.net/projects/git-osx-installer/
另一种是通过 MacPorts (http://www.macports.org
) 安装。如果已经装好了 MacPorts,用下面的命令安装 Git:
$ sudo port install git-core +svn +doc +bash_completion +gitweb
这种方式就不需要再自己安装依赖库了,Macports 会帮你搞定这些麻烦事。一般上面列出的安装选项已经够用,要是你想用 Git 连接 Subversion 的代码仓库,还可以加上 +svn 选项,具体将在第八章作介绍。(译注:还有一种是使用 homebrew(https://github.com/mxcl/homebrew
):brew install git
。)
在Windows上安装
在 Windows 上安装 Git 同样轻松,有个叫做 msysGit 的项目提供了安装包,可以到 GitHub 的页面上下载 exe 安装文件并运行:
http://msysgit.github.com/
完成安装之后,就可以使用命令行的 git
工具(已经自带了 ssh 客户端)了,另外还有一个图形界面的 Git 项目管理工具。
Git的基本操作
注意:以下演示用git对txt文档进行版本的跟踪,每次对txt文件修改或者回滚后注意跟新txt内容。建议使用notpad打开txt文件,它会自动监控内容改变并且提示更新。
本地仓库操作示例
初始化新仓库
在D盘根目录创建名称为git的文件夹,接下来把该文件夹做成本地的git仓库并进行一些基本的操作。
安装好git软件之后,进入git文件夹,在空白处点击鼠标右键,选择Git Bash Here
.
执行:
zhangmumu@zhangmumu MINGW64 /d/git
$ git init
Initialized empty Git repository in D:/git/.git/ # 这里显示新增了.git文件
初始化后,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。不过目前,仅仅是按照既有的结构框架初始化好了里边所有的文件和目录,但我们还没有开始跟踪管理项目中的任何一个文件。
查看状态
当前目录建立文件git-test.txt
里面录入内容:first Content
。如上该文件第一次编辑结束,保存一下。
执行:
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status # 查看目前状态(status)经常使用的命令
On branch master #目前所在分支,处于master主分支,后续会提到分支的操作
No commits yet #目前没有任何提交(commits)
Untracked files: #提示有文件没有跟踪,并且提示下一步怎么操作
(use "git add <file>..." to include in what will be committed)
git-test.txt
nothing added to commit but untracked files present (use "git add" to track)
增加跟踪
执行:
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git add git-test.txt
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: git-test.txt
执行git add *
之后并没有返回。再执行git status
查看当前状态,状态中可以看到新增了一个文件,等待提交(commit),并且提示可以通git rm --cached <file>
去unstage该文件。
stage
直接翻译是阶段
的意思,git中的stage我理解成暂存
,add文件之后是加入了git的暂存区。
提交文件
执行:
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git commit -m "fist-commit" #提交命令,-m 之后的字符串是对本次提交的备注内容
[master (root-commit) 7368c19] fist-commit
1 file changed, 1 insertion(+) #显示文件增加了一行内容
create mode 100644 git-test.txt
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status
On branch master
nothing to commit, working tree clean
git commit -m " "
提交命令,-m
之后是输入对本次提交的备注内容。
提交记录
查看提交的记录,执行:
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git log
commit 7368c19dc88ca2062b3c24a25334a9ce04824b2c (HEAD -> master)
Author: zhangmumu
Date: Sat Sep 8 08:48:34 2018 +0800
fist-commit
以上显示目前仅仅有一次提交内容。
舍弃修改
在日常文件编辑中,有时候想放弃当前修改回到当前git版本中样子。git-test.txt
文件中的做任意的修改,修改之后想放弃这次修改。
执行:
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status #查看状态可以看到文件有修改内容
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: git-test.txt
no changes added to commit (use "git add" and/or "git commit -a")
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git checkout * # 撤销当前修改,git是支持正则的
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status #再次查看状态,干净的,修改已经被撤销
On branch master
nothing to commit, working tree clean
如果文件已经增加到了stage(暂存区),怎么回滚?再次对文档进行任意修改,执行:
# 修改文件后查看状态
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: git-test.txt
no changes added to commit (use "git add" and/or "git commit -a")
# 文件add增加到暂存区
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git add *.txt
# 再次查看状态
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: git-test.txt
# git rest HEAD 命令将暂存区的文件unstage撤出暂存区
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git reset HEAD *
Unstaged changes after reset:
M git-test.txt
# 再次查看状态,文件已经撤出暂存区域,checkout一下就可以撤销本次修改了
zhangmumu@zhangmumu MINGW64 /d/git (master)
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: git-test.txt
no changes added to commit (use "git add" and/or "git commit -a")
以上的操作消化吸收之后,基本上是入门了。下面做一个服务器仓库的实际操作。
远程服务器操作
目前很多网站提供git平台进行代码托管的,这里推荐码云它的文档中说的很详细了。码云提供的GIT大全包含了Git插件、客户端、浏览器插件、文档、常用指令等等。
在日程使用中,感觉远程服务器拉去代码与本地操作相比较多了push
和pull
操作,前者是将本地的代码推送到远程服务器,后者是将远程的代码拉去到本地。
基本配置
码云中Git的基本配置说的很明白,本地配置用户名和邮箱之后需要生成并部署SSH KEY用来让远程项目识别你的访问权限,每台电脑会生成自己的key,将key加入到自己的账号设置之后,电脑有访问远程服务器的权限。
拉取远程代码
通常远程代码地址有两种
- HTTPS的,类似这样:
https://gitee.com/zhangmumu_star/[项目名称].git
- SSH的,类似这样:
git@gitee.com:zhangmumu_star/[项目名称].git
建议使用SSH地址,HTTPS拉去的时候需要输入自己的码云账号和密码,而SSH则不需要。
在本地建立好工作目录之后,打开git bash
,拉去代码命令:
$ git clone git@gitee.com:zhangmumu_star/[项目名称].git
建立本地分支
建立本地分支且切换到本地分支:
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (master)
$ git checkout -b zz #建立本地分支并且切换到该分支命令
Switched to a new branch 'zz'
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch #查看分支,目前已经在zz分支上面
master
* zz
分支合并
刚刚从master分支中建立的分支zz是跟master一模一样的。
如果A分支跟B分支内容上有不一样的话,希望把B分支内容跟A分支合并。那么就切换到B分支然后执行合并命令:
git checkout B #切换到B分支
git merge A #目前位于B分支,mergeA的意思就是把A分支内容合并到B分支
查看本地分支与远程分支映射关系
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -vv
master 5cdaf1a [origin/master] commit
* zz 5cdaf1a commit
映射关系命令为:Git branch -vv
。其中返回结果中origin
表示远程的意思,本地的master分支与远程的master分支是有映射关系的。本地的zz分支并没有与远程的分支有映射关系。
将本地分支推送到远程
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git push origin zz:zz #将本地分支推送到远程
Total 0 (delta 0), reused 0 (delta 0)
remote: Powered by Gitee.com
To gitee.com:zhangmumu_star/framwork_test.git
* [new branch] zz -> zz
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -vv #查看对应关系
master 5cdaf1a [origin/master] commit
* zz 5cdaf1a commit
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -a #查看远程分支
master
* zz
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/zz
可以看到本地分支已经推送到了远程,但是本地分支跟远程分支并没有映射关系。没有映射关系的时候在推送和拉去代码的时候必须指定好本地分支和远程分支,如下:
git pull <remote> <branch> #制定本地分支和远程分支
git push <remote> <branch>
指定的意思就是,把本地分支<branch>
推送到远程分支<remote>
中。反向拉去的时候意思一样。
建立映射关系
在本地分支和远程分支没有映射关系的时候拉去代码会有如下提示:
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> zz
建立映射关系:
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -u origin/zz #建立映射关系
Branch 'zz' set up to track remote branch 'zz' from 'origin'.
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git branch -vv #查看映射关系
master 5cdaf1a [origin/master] commit
* zz 5cdaf1a [origin/zz] commit
此外也可以使用上面提示的语句建立映射关系:
git branch --set-upstream-to=origin/<branch> zz
# 上面的<branch>指的是远程分支的名,zz指的是本地分支名
拉取到本地
在已经克隆了代码并且做好映射关系之后,将代码拉取到本地的方法:
Administrator@SKY-20171129XPN MINGW64 /d/works/framwork_test (zz)
$ git pull
Already up to date.
提交到远程
跟本地<a href="#提交文件">提交文件</a>的区别是,在依次执行完add
,commit
命名之后需要执行push
命令来将本地的代码提交到远程。