• 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上

  1. 去github上new一个仓库,起名learngit,其他默认(可以看到,github给出了提示,告诉你如何把本地的仓库同步到这里)
  2. $ 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 之后使用此命令推送即可

克隆仓库

  1. 去github上创建了一个新的仓库且自动生成了readme文件,名叫gitskill
  2. 本地要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所做的笔记