参考于http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
Linux下获取帮助
man git-***
man git-diff
man git-checkout
git help <command> # 显示command的help
配置
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
git config --global color.ui true
git config --global push.default matching
加上–global 之后在写入到 ~/.gitconfig中, 不加–global 写入到当前repo中.git/config中
开启新项目并初始化
cd /home/git/myproject
git init
git add .
git commit #这个步骤会自动进入编辑模式,要求开发者提交“开发信息” git commit -m "commit information"
修改最后一次提交的信息
git commit --amend
查看log
git log --pretty=oneline # commit就一行
git log -p # 输出详细的日志内容
git log -p -2 # 查看最近两次详细修改内容的diff
git log --graph # 带分支合并图,
git log --abbrev-commit # 简写commit ID
查看命令历史
git reflog
版本库(Repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,
还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
git status 查看git状态
git status
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: ps.txt
#
git status -s: 查看简洁状态
$ git status -s
AM date.txt
MM ps.txt
git status -s 会出现2个字符
第一个M 表示 文件在History与Staging Area有差异
第二个M表示 文件在Staging Area与Working Directory有差异
diff 对比
查看工作区和版本库里面最新版本的区别
git diff HEAD -- readme.txt
git diff 比较Working Directory与 Staging Area之前的区别,一旦git add 之后,如果想比较History和Staging Area之前的比较用 git diff - - staged,
如果想比较Working Directory与History之间的区别用git diff HEAD ,
如果显示太多 使用git diff - - stat
git diff <file> # 比较当前文件和暂存区文件差异
git diff
git diff <$id1> <$id2> # 比较两次提交之间的差异
git diff <branch1>..<branch2> # 在两个分支之间比较
git diff --staged # 比较暂存区和版本库差异
git diff --cached # 比较暂存区和版本库差异
git diff --stat # 仅仅比较统计信息
生成patch
git diff > diff.patch # 生成补丁
git apply < diff.patch # 打补丁
git apply --check diff.patch # 测试补丁能否成功
checkout
git checkout -- file
命令git checkout – readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
另一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
reset 撤销文件
参考与http://www.cnblogs.com/craftor/archive/2012/11/04/2754140.html
git reset
仅用HEAD指向的目录树重置暂存区,工作区不会受到影响,相当于将之前用git add 命令更新到暂存区的内容撤出暂存区。引用也未改变,因为引用重置到HEAD相当于没有重置。
git reset HEAD
同上
git reset -- filename
仅将文件filename 的改动撤出暂存区,暂存区中其他文件不改变。相当于命令git add filename 的反操作。
git reset HEAD filename
同上
git reset --soft HEAD^
工作区和暂存区不改变,但是引用向前回退一次。当对最新的提交说明或者提交的更改不满意时,撤销最新的提交以便重新提交。
之前提到过修补提交命令git commit –amend,用于对最新的提交进行重新提交以修补错误的提交说明或者错误的提交文件。修补提交命令实际上相当于执行了下面两条命令。(注:文件.git/COMMIT_EDITMSG保存了上次的提交日志)
git reset --soft HEAD^
git commit -e -F .git/COMMIT_EDITMSG
git reset HEAD^
工作不改变,但是暂存区会回退到上一次提交之前,引用也会回退一次。
git reset --mixed HEAD^
同上
git reset --hard HEAD^
彻底撤销最近的提交。引用回退到前一次,而且工作区和暂存区都会回退到上一次提交的状态。自上一次以来的提交全部丢失。
–soft –mixed –hard,会对working tree和index和HEAD进行重置。
回退版本
git reset --hard HEAD^
git reset --hard [commit-id]
上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
git rm
把readme.txt 从版本库中删除
git rm readme.txt
在没提交前恢复
git checkout HEAD readme.txt
git clean
git reset --hard
git clean -fdx
将添加的文件,目录等全部删除,恢复到HEAD的状态
git rm –r --cached abc.xxx
branch 分支
git branch dev # 创建一个名为dev的branch
git checkout -b dev # 创建一个名为dev的branch,并转到dev分支上
git branch # 显示branch
合并分支
git checkout master
git merge dev # git merge用于合并指定分支到当前分支。 dev分支合并到master上
删除分支
git branch -d dev # 删除 dev 分支
git branch -D dev # 强行删除
解决冲突
master: readme.txt
this is the first version
feature1: readme.txt
this is the 1st version
合并分支产生冲突
git checkout master
git merge feature1
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
打开readme.txt
<<<<<<< HEAD
this is the first version
=======
this is the 1st version
>>>>>>> feature1
修改为:
this is the 1ST version
再次提交
git add readme.txt
git commit -m "conflict fixed"
git stash
git stash
Saved working directory and index state WIP on master: 002aefa conflict fixed
HEAD is now at 002aefa conflict fixed
git stash list
stash@{0}: WIP on master: 002aefa conflict fixed
git stash apply stash@{0}
git stash drop
用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除
git stash pop
用git stash pop,恢复的同时把stash内容也删了
tag 标签
git tag v1.0
git tag v0.01 63bf4b106
git tag -a v0.1 -m "version 0.1 released" 3628164
创建带有说明的标签,用-a指定标签名,-m指定说明文字
查看标签:
git tag
标签不是按时间顺序列出,而是按字母排序的
显示标签:
git show v0.1
删除标签:
git tag -d v0.9
.gitignore
在工作目录下不想被git管理的,可以在工作目录下新建一个.gitignore文件,
可以参考https://github.com/github/gitignore
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
*.egg-info/
.installed.cfg
*.egg
配置别名
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
远程仓库
添加远程仓库
git remote add origin git@code.csdn.net:zhubinqiang/mytms.git
push到远程端
git push -u origin master
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
git push不上, 在git server 版本库中端做一下操作
chmod 755 -R .git/refs/
chmod 755 -R .git/objects/
在.git/config添加以下内容
[receive]
denyCurrentBranch = ignore
添加到从CSDN上的repo
1.先在CSDN的git repo中新建一个mytms的repo
2.在本地初始化,并添加远程repo:
mkdir mytms
touch README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@code.csdn.net:zhubinqiang/mytms.git
git push -u origin master