本文只是帮助你入门,从一个不会使用git的小白,到会解决开发中常见的使用。
废话不多说,直接进入正题。
git
git是用于Linux内核开发的版本控制工具。与CVS、Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。git的速度很快,这对于诸如Linux内核这样的大项目来说自然很重要。git最为出色的是它的合并追踪(merge tracing)能力
安装
安装,其实很简单,和普通软件安装无异。这里不介绍了。
创建新仓库
创建一个目录,打开,然后执行
git init
创建一个新的git仓库.
初始化git的方法有很多种
- 在本地创建
- 在gitlab或github上创建,git clone下来,
- 图形界面上创建
克隆仓库
执行如下命令可以创建一个本地克隆版本:
git clone /path/to/repository
如果实在远端服务器上的仓库,你的命令会是这样子:
git clone username@host:/path/tp/repository
克隆仓库也有很多内容,比如修改仓库名之类的等等。
工作流
你的本地仓库由git维护的三棵树
组成。第一棵树是你的工作目录
,它持有实际文件;第二个是暂存区(index)
,它像是缓存区,临时保存你的改动;最后是HEAD
,它指向你最后一次提交的结果。
添加和提交
你可以提交更改(吧它们添加到暂存区),使用如下命令:
git add <filename>
git add *
git add .
这是git基本工作流程第一步;使用如下命令以时间提交改动:
git commit -m '代码提交的信息'
现在,你的改动已经提交到HEAD,但是没有提交到你的远端仓库。
推送改动
你的改动现在已经在本地仓库的HEAD中了。执行如下命令以将这些改动提交到远端仓库:
git push origin master
可以把master换成你想要推送的任何分支。
如果你没有克隆现有的仓库,并欲将的仓库连接到某个远程服务器,你可以使用如下命令添加:
git remote add origin <server>
如此,你就可以将你的改动推送到所添加的服务器上去了。
分支
分支是用来将特性开发绝缘开来的,在你创建仓库的时候,master是"默认的"分支。在其他分支进行开发,完成后再将他们合并到主分支上。
创建一个叫"feature_test"的分支,并切换过去:
git checkout -b feature_test
# or
git branch feature_test
git checkout feature_test
切换回主分支
git checkout master
删除分支
git branch -d feature_test
除非你将分支推送到远程仓库,不然该分支就是其他人不可见的:
git push origin <branch>
更新与合并
要更新你本地仓库至最新改动,执行:
git pull origin <branch>
以在你工作目录中获取(fetch)
并合并(meger)
远端的改动。
要合并其他分支到你当前分支(如master),执行:
git merge <branch>
在这两种情况下,git都会尝试去自动合并并改动。遗憾的是,这可能并非每次都成功,并可能出现(conficts
).这个时候就需要你修改这些文件手动合并这些冲突(conflicts
).改完后,你需要执行如下命令将他们标记为合并成功:
git add <filename>
在合并改动之前,你可以使用如下命令预览差异:
git diff <source_branch> <target_branch>
标签
为软件发布创建标签是推荐的。这个概念早已存在,svn中也有。你可以执行如下命令创建一个叫做1.0.0
的标签:
git tag 1.0.0 abcdef1234
abcef1234是你想要标记的提交的ID的前10位字符,可以使用下列命令获取提交ID:
git log
你也可以使用少一点的提交ID前几位,只要它的指向具有唯一性。提交ID可以回滚。
log
如果想要了解蹦迪仓库的历史记录,最简单的命令:
git log
还可以添加一些参数来修改它的输出,得到自己想要的结果。只看某个人提交的记录:
git log --auth=youdi
一个压缩后每一条提交记录只占位一行
git log --pretty=oneline
或者你想要通过ASCII艺术的树形结构来显示所有的分支,每个分支都标示了它的名字和标签:
git log --graph --oneline --decorate --all
看看哪些文件改变了:
git log --name-status
这些只是你可以使用的参数一部分,更多可以查看:
git log --help
替换本地改动
假如你操作失误(当然,这最好永远不要发生),你可以使用如下命令替换掉本地改动:
git checkout -- <filename>
此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。
假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它
git fetch origin
git reset --hard origin/master
使用小贴士
彩色的git输出
git config color.ui true
显示历史记录时,每一个提交信息只显示一行
git config format.pretty oneline
交互式添加文件到暂存区
git add -i
下面介绍一些工作中常用的小技巧:
撤销刚刚git add(暂存区的文件)
git reset --hard <filename>
撤销暂存区中指定的commit之前的提交
git reset --hard <commit的hash值>
注:--hard丢弃working directory中内容的修改
--soft保留working directory中内容的修改
修改commit最新一次的注释信息
git commit -amend
会打开编辑器,可能是nano,或vim
修改以后,重新push到远端仓库
git push master origin -f
另外:
git commit -amend -m 'msg'
修改commit的历史注释信息
git rebase -i head~2
修改前2条提交记录
版本回退
版本回退,需要使用git commit提交ID,查看如下命令:
git log
回到指定版本
git reset --hard <commit hash value>
远端仓库也回退
git push origin <branch> -f
忽略文件
如果忽略文件,在仓库中创建 .gitignore
vim .gitignore
*.pyc
/tmp
database.config
.gitignore
.tmp
进行匹配,匹配成功文就不会添加到work directory.
储藏(Stashing)
经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。
“‘储藏”“可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。
git stash
查看储藏的信息
git stash list
放出储藏
git stash pop <stash index>
多个仓库,开发
在公司开发,一般都是将项目clone到自己名下的仓库中,进行开发,如何在本地拉去项目中最新的项目。
修改git配置文件 .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = git@github.com:jacksonyoudi/python-note.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[remote "google"]
url = git@github.com:google/python-note.git
fetch = +refs/heads/*:refs/remotes/origin/*
按上面配置好以后
拉取项目最新代码,合并到本地
git pull google master
推送到项目上,而非自己仓库
git push google feature
git的内容就介绍到这里,以上都是皮毛,你只当做入门的初级文章即可,不必深究。如果有精力,希望你配置好github.
如想深入,建议官方文档。