LearnGit
Jan 19, 2016
- content
{:toc}
学习Git的使用。
安装git略过
创建仓库
mkdir learngit
cd learngit
git init
vim readme.txt
git add readme.txt
git commit -m "wrote a readme file"
修改文件
vim readme.txt
git status
git diff readme.txt
git add readme.txt
git status
git commit -m "add distribute"
git status
版本回退
vim readme.txt
git add readme.txt
git commit -m "append GPL"
git log
git log --pretty=oneline
git reset --hard=HEAD^
cat readme.txt
git reflog
git reset --hard=1ed051d(id的前几位)
暂存区
vim readme.txt
vim LICENSE
git status
git add readme.txt
git add LICENSE
git status
git commit "understand how stage works"
git status
工作区-》暂存区-》
再次理解暂存区
vim readme.txt
git add readme.txt
vim readme.xt
git commit -m "git tracks changes"
#此处只提交了add到暂存区的内容 ,第二次vim的没有提交,因为没有add到暂存区
test:
vim readme.txt
git diff readme.txt (有区别)
git add readme.txt
vim readme.txt
git diff readme.txt (没区别)
git diff HEAD -- readme.txt (有区别)
所以 diff 比较的是代码区和暂存区有没有区别 ,add之后就没有区别了
加上HEAD只有比较的是代码区和版本库中最新版本的比较
修改撤销
vim readme.txt
git status
git checkout -- readme.txt
vim readme.txt
git add readme.txt
git status
git reset HEAD readme.txt
git checkout -- readme.txt
vim readme.txt
git add readme.txt
git commit readme.txt -m "hah "
git reset --HEAD^
删除文件
vim test.txt
git add test.txt
git commit -m "add test.txt"
rm test.txt
git status
git checkout -- test.txt
rm test.txt
git status
git rm (git add test.txt)
git commit -m "remove test.txt "
关联Github
要使得刚创建的本地仓库learngit同步到github上
- 去github上new一个仓库,起名learngit,其他默认(可以看到,github给出了提示,告诉你如何把本地的仓库同步到这里)
$ git remote add origin git@github.com:peterjiao/learngit.git
remote 远程
origin 起源$ git push -u origin master
push 推送
第一次使用-u命令,推送所有master分支到github$ git push origin master 之后使用此命令推送即可
克隆仓库
- 去github上创建了一个新的仓库且自动生成了readme文件,名叫gitskill
- 本地要clone这个仓库
在一个父级目录:
$ git clone git@github.com:peterjiao/gitskills.git
即可将远程仓库的内容clone到本地
分支
git checkout -b dev (等于两条命令 git branch dev;git checkout dev)
git branch
vim test.txt
ls
git add test.txt
git commit test.txt -m "branch test"
git checkout master
ls (发现并没有test.txt)
git checkout dev
ls
git checkout master
git merge dev
ls
git branch -d dev
git branch
解决分支冲突
git checkout -b feature1
vim readme.txt<1>
git add readme.txt
git commit readme.txt
git checkout master
vim readme.txt<2>
git add readme.txt
git commit readme.txt
合并被编辑了同一个文件会有冲突
git merge feature1 (conflict!!)
git status
vim readme.txt
git add readme.txt
git commit -m "conflict fixed "
git log --graph --pretty=oneline --abbrev-commit
分支合并策略
在合并分支时
git merge --no-ff -m "merge with no-ff" dev
如此会在log中新生成一个commit表示合并记录
git log --graph --pretty=oneline --abbrev-commit
Bug分支
存在一种情况 你正在使用dev分支工作,突然来了一个bug要紧急解决,但是dev分支的工作不能commit到dev分支,如此你就不能切换到master分支去创建bug分支(已经尝试过,只有commit到dev才能切换)。 怎么办呢。
可以使用stash命令,将dev分支修改的文件隐藏起来,然后再切换到master分支,创建bug分支,解决bug,合并到master分支,回到dev分支,显隐dev分支上使用stash命令隐藏起来的原来的工作内容 。
git checkout -b dev
vim readme.txt
vim hellworld.java
git add helloworls.java
git checkout master !!!
git stash (当前在dev分支)
git checkout master (good)
git checkout -b issue-101
vim readme.txt (模拟修复bug)
git add readme.txt
git commit -m "fix bug 101"
git checkout master
git merge --no-ff -m "merged bug fix 101" issue-101
git branch -d issue-101
#ok,bug is fixed
git checkout dev
git status
git stash list
git stash pop(git stash apply ; git stash drop)[包含两步,恢复隐藏的,删除在list中的记录]
git stash list
ps:
可以多次使用git stash 隐藏,使用git stash list 查看,然后恢复指定的记录
git stash apply stash@{0}
直接删除创建的分支,不合并
git checkout -b feature2
vim newfile.txt
git add newfile.txt
git commit -m "add a newfile"
git checkout master
git branch -d feature2 !!!error
git branch -D feture2 !!!good
分支冲突
两个不同的人不同的机器,同时修改同一个分支的同一个文件,同时推到了远程库,第二个人会报冲突,需要先处理冲突,然后推到远程库
git remote
git remote -v
git checkout -b dev
vim hello.java
git add hello.java
git commit hello.java -m ""
git push origin dev {git push origin <branch-name>}
#以上1号机创建并向远程仓库推送了dev分支
#在另一个目录 2号机
git clone git@github.com:peterjiao/learngit.git
(默认clone是master分支,没有dev分支 )
git checkout -b dev origin/dev (此处是两个各命令,创建了dev分支,关联了远程库的dev分支)
(
git checkout -b dev //创建,切换到dev
git branch --set-upstream-to=origin/dev dev //本机dev关联远程库dev
)
vim hello.java
git add hello.java
git commit hello.java -m ""
git push origin dev
#推送到了远程仓库dev
#此时1号机
vim hello.java
git add hello.java
git commit hello.java -m ""
git push origin dev
#报错,冲突。需要使用pull,将远程库同步到本地,然后合并冲突,再提交
git pull
#报错,本地库的dev还没有和远程库的dev分支同步需要先同步,或者使用git pull <remote> <branch>,指定要同步的库和分支
git branch --set-upstream-to=origin/dev dev
git pull //成功pull
vim hello.java
git add hello.java
git commit hello.java
git push origin dev
标签
git branch
git checkout master
git tag v1.0 {git tag <name>}
git tag {查看所有标签}
#给历史commit打标签
git log --pretty=oneline --abbrev-commit
git tag v0.9 xxxx
git tag
git show v0.9 {git show <tagname>}
#带有说明comment的标签
git tag -a v0.1 -m "version 0.1 released" xxxxxx
git show v0.1
#私钥签名的标签
git tag -s v0.2 -m "signed v0.2 released" xxxxxx
git show v0.2
#删除标签
git tag -d v0.1
#推送标签到远程库
git push origin v1.0 {git push origin <tagname>}
git push origin --tags{一次性推送所有tag}
#删除远程库中的标签
git tag -d v0.2
git push origin :refs/tags/v0.2
本文是看了廖雪峰的官方网站中关于Git所做的笔记