github使用
2018-12-21 本文已影响0人
kxmile
#生成秘钥
ssh-keygen -t rsa -C "your@qq.com" -b 4096
#查看秘钥
cat ~/.ssh/id_rsa.pub
#取消文件模式不同
git config --add core.filemode false
#忽略文件
.gitignore
#配置文件位置
.git/config
#查看分支作者
git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -k5n -k2M -k3n -k4n
简写
git config --global alias.st status
git config --global alias.unstage 'reset HEAD'
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 config --global user.name "Your Name"
git config --global user.email "email@example.com"
基础操作
#初始化
git init
#查看状态
git status
#追加文件到暂存区
git add file.txt
#提交
git commit -m " 备注信息"
文件变动
#查看文件变化内容 工作区与暂存区
git diff file.txt
# 暂存区 与版本
git diff --cached
git diff --staged
-----------------------版本库--------------------------------------------
| |
git diff --cached
| |
-------------暂存区---------------------- git diff HEAD
| |
git diff
| |
-----工作区--------------------------------------------------------------
版本回退
# 同步远程分支记录到本地
git remote update origin --prune
#查看版本
git log
git log --pretty=oneline
#回退上个版本
git reset --hard HEAD^
git reset --hard c6bab6
#查看全版本
git reflog
文件切换
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: already-add.txt
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: untrack.txt
# 删除文件
git rm trash.txt
#回退删除
git checkout -- trash.txt
#查看仓库
git remote -v
#添加仓库
git remote add origin
#由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
git push -u origin master
git push origin master
#新增分支dev,并且跳到dev
git checkout -b dev
#当前dev分支 作一次提交,只有东西提交了 commit才会记录
git commit -m "dev first"
#切到master
git checkout master
#查看所有分支
git branch -a
# 当前master ,合并dev分支
git merge dev
# 删除dev分支
git branch -d dev
#查看分支
git branch
#创建分支
git branch <name>
#切换分支
git checkout <name>
#创建+切换分支
git checkout -b <name>
#合并某分支到当前分支
git merge <name>
#删除分支
git branch -d <name>
git log --graph --pretty=oneline --abbrev-commit
#通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
#如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
git merge --no-ff -m "merge with no-ff" dev
关于git stash
#存储本地工作环境
git stash
#查看列表
git stash list
#恢复方式1
git stash apply
git stash drop
#恢复方式2
git stash pop
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
$ git stash list
stash@{0}: WIP on dev: f52c633 add merge
git stash apply stash@{0}
- 未被追踪的文件:指的是新建的文件或文件夹且还没加入到暂存区(新建的还没有被git add 过得)
- 未加入到暂存区的文件:指的是已经被追踪过,但是没有加入到暂存区(已经执行过git add/commit的但是这次修改后还没有git add)
举例:
readme.md
已经被git add
/git commit
过,但是呢 我这次只是修改了,而且没有修改完,不能commit
test
新建的文件夹,没有被git add
/git commit
过
有个急事需要处理,这时候我需要切换分支,去处理紧急任务,比如文中的举例去修改bug,正确的步骤:
git add test
(让git去追踪这个新文件)
git stash
保留现场
如果我不执行这两个命令,那么我在修改BUG完成之后
git status
,就会发现readme.md
没有添加到暂存区,同时又多了个test
文件,但是自己的readme.md
没有完成,万万不可以提交,这样导致bug的修改代码也提交不了。所以你需要
git stash
,这样你在提交修改bug代码的时候 ,就不会看见readme.md
和test
。可以安心提交修改bug的代码。
为什么要用stash?一开始,我也觉得没必要,直接切换分支,再回来是一样的啊。
然后测试了一把,就知道原因了。
情景如下:
1、在dev分支,创建一个新文件test6.txt。并add它,让它stage。
2、这时切回master分支,你会看到这个test6.txt居然也在master分支里。但它实际上是属于dev分支的。怎么办?
3、git stash就有作用了。切回dev分支,执行git stach。这时git bash会告诉你
“Saved working directory and index state WIP on newF2: b63fbcb add test6.txt
HEAD is now at b63fbcb add test6.txt”。它已经把test6.txt的现场保存好了。
4、这时你在切回master分支,test6.txt就消失了。
现在懂了吧。。。。为什么要用git stash。
另外:没有被stage或者head的文件,是无法被 stash的。而且会显示在各个分支里。让你迷惑它到底该属于哪个分支。
所以stash起作用的全是stage 或者 head 的文件。理论来自官网,“也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。”
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。
现在,你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:
$ git checkout -b dev origin/dev
git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
$ git branch --set-upstream-to=origin/dev dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
因此,多人协作的工作模式通常是这样:
首先,可以试图用git push origin <branch-name>推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
git rebase
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
#用于新建一个标签,默认为HEAD,也可以指定一个commit id;
git tag <tagname>
#可以指定标签信息;
git tag -a <tagname> -m "blablabla..."
#可以查看所有标签。
git tag
#查看标签信息
git show <tagname>