Git learning note
本笔记整理自廖雪峰老师的Git教程,加上了自己的实践结果和一些理解,旨在使科研工作者(基本上是独立开发的那种)看完就能理解和使用Git。廖老师的教程生动活泼,条理清晰,推荐阅读。还可以赞助哦。
目录
Git 简介
Git是分布式版本控制系统。 啥是分布式,和与之相对的集中式咧?
举个栗子
小a,小b,小c共同开发项目,有两种版本控制方法:
集中式:
服务器维护一个最新版本项目,当小a/b/c要修改项目的时候,就从服务器上下载项目,改完了上传。为了保证服务器上永远是最新的,就需要一直联网;而且一旦中央服务器崩了,一切都over。
CVS是最早的版本控制系统,SVN是目前最流行的集中式版本控制系统。上述两个都是开源、免费的。
分布式
一开始,小a本地电脑有一个仓库,用于储存“小a对项目的修改”(小b、小c也一样)。需要更新整个项目的时候,小a、b、c之间就互相推送“修改”,那么本地仓库就保存了“所有人对该项目的修改”。因此,每个人都有最新版的项目,断网断电也不用担心。
时下最火热的当然就是Git啦~
Git 与 GitHub
项目伊始,只有一个原始版本库(版本库也叫仓库),别的机器可以clone这个原始版本库,那么所有clone的机器,它们的版本库其实都是一样的,并没有主次之分。
所以团队协作的时候,这样做到版本控制解:找一台电脑充当服务器的角色,oncall 24 hour,其他每个人都从这个“服务器”仓库clone一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。(具体操作请看廖老师教程)
没有搭建服务器怎么办?用GitHub。这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。
GitHub还是一个开源协作社区,通过GitHub,既可以让别人参与你的开源项目,也可以参与别人的开源项目。
悄咪咪说一句,国内的Git托管服务是码云
Git使用
命令简要解释
命令 | 解释 |
---|---|
git init | 初始化/新建仓库 |
git config [–global] | 设置Git配置 |
git add < filename > | 添加文件修改到暂存区 |
git commit | 从暂存区提交本次修改到当前分支 |
git status | 查看仓库状态(哪些文件修改、是否提交) |
git diff | 查看和上一次commit版本的具体差别 |
git log | 查看历史commit |
git log –graph | 以图的形式查看当前分支历史commit |
git reset | 将当前版本退回设定版本 |
git checkout – < filename > | 撤销工作区文件的修改 |
git checkout < branchname > | 切换到指定分支 |
git checkout -b < branchname > | 创建并切换到分支 |
git rm < filename > | 从当前版本删除文件(相当于在文件系统删除文件后add) |
git remote add < 远程仓库名 > < 远程仓库地址 > | 添加远程仓库 |
git remote -v | 查看所有远程仓库和地址 |
git push < 远程仓库名 > < 本地分支名 > | 将本地分支推送到远程仓库 |
git clone < 远程仓库地址 > | 将远程仓库克隆到本地工作路径 |
git fetch < 远程仓库名 > | 抓取远程仓库所有更新到本地仓库 |
git pull < 远程仓库名 > | 抓取并合并远程仓库所有更新到本地仓库 |
git branch | 查看所有分支 |
git branch < branchname > | 创建分支 |
git branch -d < branchname > | 删除分支,将“-d”改为“-D”是强制删除 |
git branch -dr < remote/branch > | 删除远程分支 |
git merge < branchname > | 将指定分支合并到当前分支上 |
安装
在cmd输入git
,看看系统有没有安装Git:
比如在linux下:
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
创建仓库
版本库又名仓库,英文repository,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
在你的工作目录下,输入
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
生成的 .git
目录就是用来跟踪管理仓库的。
配置仓库
git config
命令用于一系列配置。配置Git的时候,加上--global
是针对当前用户起作用的(比如给命令起别名),如果不加,那只针对当前的仓库起作用。
配置文件:
每个仓库的Git配置文件都放在.git/config文件中,当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中。
添加、提交:
用命令git add <filename>
将文件更改添加到暂存区,git add .
添加所有更改到暂存区
$ git add readme.txt
$ git add .
添加成功则没有返回消息
$ git commit -m "wrote a readme file"
[master (root-commit) cb926e7] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
参数-m
后面是这次提交的说明
忽略某种文件
工作目录下创建一个名为.gitignore的文件,把要忽略的文件名或文件夹或文件类型填进去,Git就会在commit的时候自动忽略这些文件。
不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:github/gitignore
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略数据集;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
- 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
举个栗子
一个.gitignore文件
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
# My configurations:
db.ini
deploy_key_rsa
更多实操请看廖老师教程。
撤销修改
一般步骤是 commit_last->)add_1->(add_2->…add_n)->commit,你可能会在这些时间点希望撤销:
修改还没add到暂存区,希望撤销工作区的修改,则撤销结果是撤销回上一次commit或上一次add,取决于add_1否是已经发生过
命令
git checkout -- <filename>
可以丢弃工作区的修改:$ git checkout -- readme.txt
--
这个参数说明是针对当前分支的文件,如果只用git checkout <branch_name>
表示的是切换分支修改已经add_i,想撤销到add_j
不行,已经add过之后,工作区没东西可以撤销。暂存区里面没有“版本回退”。
总之,只能使用git checkout
撤销工作区的修改。版本回退只能用git reset
在commit过的版本库里面回退。
“删除文件”也是一种修改操作,commit过的文件一直存在版本库里,所以在工作区删除文件(如testdel.txt)也可以撤销。此时用git checkout -- <deletedfilename>
可撤销还没有add的“删除操作”
举个栗子 :(|)表示当前</