主要参考廖雪峰老师的Git教程自己整理了下,方便以后回顾。
Git是最好用的分布式版本控制系统。可以很方便的进行代码管理,修改,协作。CVS及SVN都是集中式的版本控制系统。
1.安装Git。在Windows下安装时,可安装Tortoisegit配合使用。Tortoisegit为Git的可视化界面客户端,方便代码的上传。
以下是ubuntu安装
$ git //查看有没有安装,
$
sudo apt-get install git //
没有就安装一下
2.创建版本库。版本库又名仓库,英文名repository。是一个文件。里面所有文件修改都能被Git跟踪。
把一个项目提交到本地仓库的步骤为:创建空目录;把这个目录变成仓库;把源文件移动到这个目录;在仓库中添加源文件(git add);提交
源文件(git commit -m)。
创建一个空目录:$ mkdir learngit $ cd learngit $ pwd
通过git init
命令把这个目录变成Git可以管理的仓库$ git init
3.把文件添加到版本库
强烈建议使用标准的UTF-8编码。
$ gedit readme.txt //在版本库文件夹下创建一个readme.txt文件,输入Git is a version control system. Git is free software.
$ git add readme.txt //把文件添加到仓库$ git commit -m "wrote a readme file" //把文件提交到仓库, -m 后面输入的是本次提交的说明
也可以一次提交多个文件(多次添加)$ git add file1.txt
$ git add . //添加全部 $ git add file2.txt file3.txt $ git commit -m "add 3 files."
// PS:在本地库添加文件后,需要add 和 commit命令提交到本地仓库
//后面更新时,只需要push到远程仓库就好
4.一些常用的命令
$ git status //时刻掌握仓库当前的状态,哪些被修改了,添加了,提交了。
$ git diff readme.txt //查看具体修改了什么内容
$ git log //显示从最近到最远的提交日志
,最前面的字符是版本号 ,以便确定要回退到哪个版本
$ git log --pretty=oneline
//简单显示从最近到最远的提交日志 ,
$ git reflog //查看命令历史,以便确定要回到未来的哪个版本
$ git diff HEAD -- readme.txt //查看工作区和版本库里面最新版本的区别
$ git stash list //查看工作现场
5.版本回退
$ git reset --hard HEAD^ //
HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
$ git reset --hard 3628164 //指定回到未来的某个版本,数字对应版本号的前几位
6.解释git add
命令实际上就是把要提交的所有修改放到暂存区(Stage)
执行git commit
就可以一次性把暂存区的所有修改提交到分支
7.撤销修改
$ git checkout -- file //丢弃工作区的修改,工作区即为当前目录下的修改
$ git reset HEAD readme.txt //把暂存区的修改撤销掉(unstage),重新放回工作区,再由工作区丢弃
8.删除文件$ rm test.txt //删除工作区文件
$ git rm test.txt //从版本库中删除该文件,并且
git commit
$ git commit -m "remove test.txt"
$ git checkout -- test.txt
//其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
9.远程仓库$ ssh-keygen -t rsa -C "youremail@example.com" //创建SSH Key,填入自己的邮箱地址
登陆GitHub,打开“Account settings”,“SSH Keys”页面
点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容
点“Add Key”
添加远程库
登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库。
在Repository name填入learngit
,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库。
接下来关联到Github账户
$ git remote add origin git@github.com:LFself/learngit.git //把上面的LFself替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库。
添加后,远程库的名字就是origin
,这是Git默认的叫法$ git push -u origin master
//把本地库的所有内容推送到远程库上$ git push origin master //本地作了提交后,把本地
master
分支的最新修改推送至GitHub
$ git push -f //暴力提交
登陆GitHub,创建一个新的仓库,名字叫gitskills。勾选Initialize this repository with a README
$ git clone git@github.com:michaelliao/gitskills.git //将远程库克隆(复制)到本地库
$ cd gitskills //查看下
$ ls
10.分支管理
$ git checkout -b dev //git checkout
命令加上-b
参数表示创建并切换到dev分支
$ git branch //查看当前分支
对readme.txt做个修改,加上一行:Creating a new branch is quick.
$ git add readme.txt //添加并提交
$ git commit -m "branch test"
$ git checkout master
//切换回master
分支
$ git merge dev //把dev
分支的工作成果合并到master
分支上
$ git branch -d dev
//删除dev
分支
$ git log --graph --pretty=oneline --abbrev-commit
//查看分支合并图
$ git merge --no-ff -m "merge with no-ff" dev
//--no-ff
参数,表示禁用Fast forward
(快速合并),-m后面是说明
$ git stash
//把当前工作现场“储藏”起来,等以后恢复现场后继续工作
$ git checkout -b issue-101
//在当前
分支上修复,就从当前分支
创建并切换到临时分支
修复完成后,切换到master
分支,并完成合并,最后删除issue-101
分支
$ git stash pop
//恢复工作现场的同时把stash内容也删了
$ git stash list
//stash 没有东西了。
$ git stash apply stash@{0}
//可以多次stash,恢复的时候,先用git stash list
查看,然后恢复指定的stash
$ git branch -D feature-vulcan
//丢弃一个没有被合并过的分支,强行删除
多人协作
$ git remote
//查看远程库的信息$ git remote -v
//显示更详细的信息
本地新建的分支如果不推送到远程,对其他人就是不可见的$ git checkout -b branch-name origin/branch-name //在本地创建和远程分支对应的分支
$ git push origin dev
//把dev分支上的所有本地提交推送到远程库,dev与远程库一致 如果推送失败,先用git pull
抓取远程的新提交$ git pull
//把最新的提交从origin/dev
抓下来,然后,在本地合并,解决冲突$ git branch --set-upstream branch-name origin/branch-name //
git pull
提示“no tracking information”,创建本地分支和远程分支的链接关系
11.标签管理。指向某个commit的指针$ git checkout master //切换到需要打标签的分支上
//查看所有标签
$ git tag v1.0 //打一个新标签v1.0
$ git tag
$ git log --pretty=oneline --abbrev-commit
//找到历史提交的commit id
$ git tag v0.9 6224937 //对特定版本打标签
$ git show v0.9
//查看v0.9的标签信息
$ git tag -a v0.1 -m "version 0.1 released" 3628164 //创建带有说明的标签
$ git tag -d v0.1
//删除v0.1版本
$ git push origin v1.0
//推送v1.0标签到远程
$ git push origin --tags
//一次性推送全部尚未推送到远程的本地标签
删除远程标签$ git tag -d v0.9
//先从本地删除$ git push origin :refs/tags/v0.9
//从远程删除 ,登陆GitHub查看是否删除
12.使用GitHub
如何参与一个开源项目呢?(如bootstrap)
点“Fork”就在自己的账号下克隆了一个bootstrap仓库,
git clone git@github.com:michaelliao/bootstrap.git
//克隆到本地
干完活后,往自己的仓库推送。再在GitHub上发起一个pull request
在Git工作区的根目录下创建一个特殊的.gitignore
文件 //把要忽略的文件名填进去,Git就会自动忽略这些文件
把.gitignore
也提交到Git
$ git add -f App.class //当文件被忽略时,用-f
强制添加文件到Git
$ git check-ignore -v App.class
//检查App.class
违反了哪个规则,然后修改对应的规则。
13. 配置别名
$ git config --global alias.st status
//以后st
就表示status
$ cat .gitconfig
//在用户主目录下,查看当前用户的Git配置文件
14.搭建Git服务器
15.从本地上传文件的一个具体实例。
本地创建版本库---把文件添加到版本库---建立远程链接,上传到Github
PS:可以一次上传多个文件到版本库;在本地合并后,再远程提交;远程直接删除比较方便。
16.git修改提交作者和邮箱
// 设置全局 $ git config --global user.name "Author Name" $ git config --global user.email "Author Email"
// 或者设置本地项目库配置 $ git config user.name "Author Name" $ git config user.email "Author Email"
17.上传到Gitblit失败原因分析
1.远程端的地址不要写错了。不要有空格等符号
2.远程端有文本,先拉取过来,合并后,再上传到远程端。