git
working directory repository
stage master(branch)
git init
git add filename
git commit -m "explanation information"
git status
git diff filename #when you edit one file but before you add it to stage
git diff HEAD -- filename #可以查看工作区和版本库里最新版本的区别(版本库包括stage和branch)
git checkout --filename #把该文件在工作区的修改全部撤销。这里有两种情况
#一种是在工作区修改后,还没有add到stage,这时撤销命令执行后,回到跟版本裤一模一样的状态;
#一种是该文件已经add到stage然后又在工作区对该文件进行了修改,这时撤销命令执行后,文件回到跟stage里一样的状态
git reset HEAD filename
#文件修改并add到stage后但还没执行commit,执行该命令可以撤销stage里的修改,把该文件重新放回工作区
git rm filename
git commit -m "explanation msg"
#在实际开发中删掉了某个文件,但是并没有在git中删掉对该文件的跟踪,git status会提示该文件已经被删除
#然后需要在git删除对该文件对跟踪, git rm filename确认对该文件对删除,并从版本库中删除该文件
#执行git rm需要执行commit以提交当前版本
git checkout --filename
#在实际开发删除了某个文件后,但是还没执行git rm 之前,可以用该命令恢复删除的文件
git log
git log --pretty=oneline
#查看每次的commit信息,包括每次的commit_ID
git reset --hard HEAD^
git reset --hard commit_ID
#回退到上一个commit版本,HEAD指代当前commit版本,HEAD^表示上一个commit版本
#直接指定commit_ID可以直接回退到指定的commit版本
git reflog
#回退到某个以前的版本,但是又想回到后来的某个版本时,不知道commit_ID的话就不能回到该版本
#git reflog可以查看每次版本改变的信息
git remote add
git remote add origin [email protected]:lactic-h/learngit.git
#在远端建立一个远程库,但是该远程库是空。于是该命令把本地库与远程库相链接
#origin是远程库的默认名称
#如果输入$ git remote add origin [email protected]:djqiang(github帐号名)/gitdemo(项目名).git
#提示出错信息:fatal: remote origin already exists.
#解决办法如下:
#1、先输入$ git remote rm origin
#2、再输入$ git remote add origin [email protected]:djqiang/gitdemo.git 就不会报错了!
git push
git push -u origin master
#将本地库的内容推送到远程库
#实质上是把本地库到master分支推送到远程库,
#第一次推送master分支时,加上参数-u,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
git push origin master
git clone [email protected]:lactic-h/gitskills.git(git_address_url)
#远程库已经存在,从远程库克隆到本地并在本地建立一个与远程库相同的本地库
#git_address_url可以是ssh链接,也可以是https链接,https链接需要输入账号密码
git branch
git branch branch_name_b
git checkout branch_name_b
git checkout -b branch_name_b
git checkout branch_name_a
git merge branch_name_b
#git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。
#注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
#当然,也不是每次合并都能Fast-forward,我们后面会将其他方式的合并。
git branch -d branch_name_b
#merge conflict
git merge branch_name_b
#error_merge_conflict
git status
#show the conflict information
vi filename
#modify the conflict file
#in fact, this step will modify the two files at the same time
git merge branch_name_b
#ff or no-ff
git merge branch_name_B
git merge --no-ff -m "merge with no-ff" branch_name_B
#ff和no ff的结果都是一样的,都会合并,
#其最大区别在于,ff会"默默"地合并,其仅仅是将指针移动到分支的最新处(当然删除分支并不会对master产生任何影响),
#而no ff则是重新建立了一个commit,然后将合并当做一个comiit来处理,自然就产生了合并的信息.
git stash
git stash list
git stash apply <choosed parameter which can assign the stash ID>
git stash drop <choosed parameter which can assign the stash ID>
git branch -d branch_name #after merge
git branch -D branch_name #enforce delete
git remote
git remote -v
#查看远程库信息,-v参数查看详细信息
git push origin master
git push origin dev #other branch
#将本地库提交到远程库
#多人合作,push时冲突
#another workmate
git clone [email protected]:lactic-h/learngit.git
git checkout -b dev
git add
git commit
git push origin dev
#myself
git push origin dev
#因为小伙伴在我之前已经提交过一次dev,所以我再次提交dev时,可能会冲突
#solution:先把remote的dev pull下来,在pull的时候会自动merge,merge的时候会出现conflict,然后在本地解决冲突,commit后再push
git pull
#pull的时候可能会报错,因为本地的dev分支并没有与远程的origin/dev分支相链接
#solution:设置dev与origin/dev链接
git branch --set-upstream dev origin/dev
#上面这个命令好像不能用了
git branch --set-upstream-to origin/dev dev
#假设远程公共仓库,有一个master和一个dev分支,进行多人协作开发时候(每个人的公钥必须加入到远程账号下,否则无法push),
#每个人都应该clone一份到本地。
#但是clone的只是master,如果远程的master和dev一样,没关系;如果不一致,则需要clone出dev分支
#git checkout -b dev origin/dev
#之后每个人在本地的dev分支上独自开发(最好不要在master上开发),
#开发完成之后push到远程dev
#git push origin dev。
#之后审核人再确定是否合并dev到master。
#tag
git tag tag_name
#给当前分支的最近提交的commit打标签
git tag
#查看标签
git log --pretty=oneline --abbrev-commit
#查看之前commit的信息
git tag tag_name commit_ID
#给之前提交的commit打标签
git show tag_name
#查看标签信息。
git tag -a tag_name -m "explanation message"
# -a参数指明tag_name, -m参数指定说明文字
git tag -s v0.2 -m "signed version 0.2 released" fec145a(commit_ID)
# 可以通过-s用私钥签名一个标签
#签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错:
git tag -d tag_name
#删除标签
git push origin tag_name
#因为创建的标签都只存储在本地,不会自动推送到远程。所以,如果要推送某个标签到远程,
git push origin --tags
#一次性推送全部尚未推送到远程的本地标签
#如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
#然后,从远程删除。删除命令也是push,但是格式如下:
git tag -d v0.9
git push origin :refs/tags/v0.9
#config
.gitignore
#本地配置文件
current_repository.git/config
#当前仓库的git配置文件
~/.gitconfig
#当前用户的git配置文件
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.unstage ‘reset HEAD‘
git config --global alias.last ‘log -1‘
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"