第一部分是文档,为了日后查看方便放到了前边[可能敲错了,详见阮一峰老师的文章]
http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
第二部分是demo,一些基本的操作,懒得截图,可以按提示敲 为
详情请见知乎专栏
https://zhuanlan.zhihu.com/p/30044692?utm_source=wechat_session&utm_medium=social
一、配置项
1、新建代码库
当前目录新建git库
git init
新建一个仓库,将其初始化为git代码库
git init [project-name]
下载一个项目和的他整个代码的历史
git clone [url]
2、配置
显示当前的git配置值
git config -list
编辑配置文件
git config -e [-global]
设置提交代码的用户信息
git config[-global] user.name "[name]"
git config[-global] user.email "[email address]"
3、添加/删除文件
添加文件到暂存区
git add [file1][file1]...
添加指定目录到暂存区,包括子目录
git add [dir]
添加当前目录所有的文件到暂存区
git add .
添加每个变化前,都会要求确认,对于同一个文件的多处变化,可以实现分次提交
git add -p
删除工作区文件,并将这次删除放入暂存区
git rm [file1] [file2]
停止追踪制定文件,但是该文件会保留在工作区
git rm --cached [file1]
改名且放到暂存区
git mv [file-original][file-rname]
4、代码提交
提交暂存区到仓库区
git commoit -m [message]
提交暂存区到指定仓库区
git commit [file] [file2] -m [message]
提交工作区自上次commit之后的变化,直接到仓库区
git commit -a
提交时显示所有的diff信息
git commit -v
使用一次新的commit替代上次提交如果代码没有任何变化,用来改写上一次commit的提交信息
git commit --amend -m [message]
重做上次commit并包括指定文件的新变化
git commit --amend [file1][file2]
5、 分支
列出所有的本地分支
git branch
列出所有的远程分支
git branch -r
列出所有的本地分支和远程分支
git branch -a
新建一个分支,但依然停留在当前分支
git branch [branch-name]
新建一个分支,并切换到该分支
git checkout -b [branch-name]
新建一个分支,指向指定commit
git branch [branch][commit]
新建一个分支,指定的远程分支建立追踪关系
git branch --track [branch][remote-branch]
切换到指定分支,并更新工作区
git checkout [branch-name]
切换到上一个分支
git checkout
建立追踪关系,在现有分支与指定的远程分支之间
git branch --set-upstream[branch][remote-branch]
合并指定分支到当前分支
git merge[branch]
选择一个commit 合并进的当前分支
git cherry-pick[commit]
删除分支
git branch -d [branch-name]
删除远程分支
git push-orinin --delete [branch-name]
git branch -dr[remote/branch]
6、标签
列出所有的tag
git tag
新建一个tag在当前的commit
git tag [tag]
新建一个tag在指定的commit
git tag [tag] [commit]
删除本地的tag
git tag -d [tag]
查看tag信息
git show [tag]
提交指定的tag
git push [remote][tag]
提交所有的tag
git push [remote] --tages
新建一个分支,指向某个tag
git checkout -b[branch][tag]
7、查看信息
显示有变更的文件
git status
显示当前的分支的版本历史
git log
显示commit历史以及每次commit发生变更的文件
git log --stat
搜索提交历史 根据关键词
git log -S[keyword]
显示某个commit之后所有的变动,每个commit占据一行
git log [tag] HEAD --pretty=format:%s
显示某个commit之后所有变动,其提交说明必须符合搜索条件
git log[tag] HEAD --grep feature
显示某个文件的版本历史包括文件改名
git log --fllow [file]
显示指定文件相关的每一次diff
git whatchange[file]
显示过去5次提交
git log -5 --pretty --oneline
显示所有的提交过的用户,按提交次数排序
git shortlog -sn
显示指定文件,是什么人在什么时间改过
git blame [file]
显示暂存区和工作区的差异
git diff
显示暂存区和上一个commit的差异
git diff --cached[file]
显示工作区和当前分支最新commit之间的差异
git diff HEAD
显两次提交的差异
git diff [first-branch]...[second-branch]
显示今天你写了多少行代码
git diff --shortstat "@{ 0 day ago}"
显示某次提交的元数据和内容变化
git show [commit]
显示某次提交发生变化的文件
git show --name-only[commit]
显示某次提交时候,某个文件的内容
git show [commit][filename]
显示当前分支的最近几次提交
git reflog
8、远程同步
下载远程仓库所有的变动
git fetch [remote]
显示所有的远程仓库
git remote -v
显示某个远程仓库的信息
git remote show [remote]
增加一个新的远程仓库,并命名
git remote add [shortname][url]
取回远程长裤的变化,并与本地分支合并
git pull [remote] [branch]
上传本地指定分支到远程仓库
git push [remte][branch]
强行推送当前分支到远程仓库 即使有冲突
git push [remote] --force
推送所有的分支到远程仓库
git push [remote] -all
9、撤销
恢复暂存区的指定文件到工作区
git checkout[file]
恢复某个commit的指定文件到暂存区和工作区
git checkout [commit] [file]
恢复暂存区的所有的文件到工作区
git checkout
重置暂存区与工作区 与上次commit保持一致,工作区不变
git reset [file]
重置暂存区与工作区 与上次commit保持一致
git reset --hard
重置当前分支的指针为指定的commit同时重置暂存区,但是工作区不变
git reset [commit]
重置当前分支的HEAD为指定的commit同时重置暂存区和工作区,与指定commit一致
git reset --hard[commit]
重置当前HEAD为指定commit但是保持暂存区和工作区不变
git reset --keep[commit]
新建一个commit用来撤销指定commit 后者的所有变化都将被前者抵消,且应用到当前分支
git revert[commit]
暂时将未提交的变化移除,稍后再移入
git stash
git stash pop
二、demo
0、准备工作
1.下载git程序 ,按步完成安装,右键git bash进入
2.测试git
- git help git//检车git的安装情况
- git config --global(可选) user.name "baipu"
- git config --global(可选) user.email "[email protected]"
1、创建版本库
cd 进入相关的目录下/在相关的目录下打开git bash
pwd 查看当前目录的状态
git init 将当前目录变成git可以管理的仓库(会多一个。git的问题件)
-
目录下新建一个文件,内容111 名字readme.txt(用于将来的添加文件)
git add readme.txt (添加到暂存区)
git commit -m "radme.txt提交"(引号部分是用来提交注释的,执行完这句话,理论上就提交成功了)
git status 查看当前是否还有文件没有提交
-
将文件内容添加2222222、333333 对文件进行修改,然后差异提交
git status 查看有哪些文件发生了修改
git diff readme.txt 查看这个文件具体有哪些字段进行了修改
git add readme.txt ;git commit -m "修改了一些字段"(重复上边提交的过程 )
2、版本回退:
-
先对read文件进行修改,然后提交(下面就是回退这一步)
- git log 进行查看自己提交的日志
- git log --pretty=oneline 上边的方法打印出来的内容可能比较多,这种让所有的信息展示在一行上
- git reset --hard HEAD^ 这个就是回退到上一个版本(git reset --hard HEAD^100这个是往前回退到前100个版本中)
- git reflog 查看自己前几部的提交,包括撤销,这时候就能看到每一步的版本号下一步恢复那个版本的时候用
- git reset --hard --5ec3e3c 回退到版本号为5ec3e3c的
- cat readme.txt 查看文件的内容,发现这个已经是第1步的时候自己修改后的文件了
3、工作区和暂存区
工作区:电脑上看到的目录,git目录下的文件,或者以后需要新建的目录文件都属于工作区的范畴
版本库:.git这个文件不属于工作区,是版本库,其中的版本库存放了很多的东西,最重要的就是stage暂存区,git为我们自动创建了第一个分支,master以及指向第一个分支的指正Head.
git add就是把文件添加到暂存区,
git commit 就是把暂存区的所有的内容提交到当前分支上
测试:
-
修改readme.txt然后添加新的文件,test.txt
- git status 可以看到,两个文件你的修改都有提示 而且是红色的
- git add git status 添加到暂存区,然后查看状态 发现两个修改的文件提示为绿色的
- git commit -m "修改信息"
- git status 没有那两个文件了
4、撤销文件修改和删除文件的操作
1、撤销修改
几种方法:
手动修改,然后add commit
按照以前的方法 git reset --hard HEAD^
-
新的方法
1.git status 查看状态(上边有提示,git checkout --file可以丢掉工作区的修改)
2.git checkout --readme.txt 把readme。txt的文件在工作区做的修改全部撤销,这里又有两种情况:- readme.txt自动修改后,还没有放到暂存区,使用撤销修改就回到了和版本库一模一样的状态
- 已经放到暂存区了,接着又做了修改,撤销修改就回到了暂存区后的状态
4.cat readme.txt
5.git add readme.txt //放到暂存区-
修改它
7.cat readme.txt//发现已经改变了
8.git checkout --readme.txt(这里的--十分关键,否则就没有效果了)
2、删除文件
- git add b.txt
- git commit -m "添加了b文件"
- rm b.txt
- git status//这时候查看已经被删掉,有两个操作1、commit掉,2、checkout恢复了
- 没有commit之前的恢复操作 : git checkout --b.txt
5、远程仓库
需要有github的账号 git和github之间的传输是通过ssh加密的,需要设置
- 创建ssh key 看看目录下有没有.ssh的目录 .ssh目录下有没有id_rsa id_rsa_pub的文件如果有的话,直接跳过如下的命令
- ssh-keygen -t rea -C "[email protected]"
- id_rsa 是私钥,id_rsa.pub是公钥,可以放心的告诉任何人
- github的 settings ssh key界面上对应的addssh key填入任意的title 然后key文本中粘贴id_rsa.pub文件的内容
添加远程库
本地的项目和github的连接
-
在github上创建一个仓库 create a new repo 仓库名 创建
git remote add origin https://github.com/github的名字/仓库名.git
git push -u orinin master 把本地仓库的分支master内容推送到元仓库中区 参数上-u的存在意义不但会把本地推送,还要把本地和远程关联起来,以后就方便多了
然后本地提交 git push origin master
远程克隆文件
git cline https://github.com/github名字/仓库名
6、创建和合并分支
1、创建分支
1.git checkout -b dev 创建并切换分支,相当于以下的两部
- git branch dev
- git checkout dev
2.git branch 查看当前的分支,这时候会列出所有的分支,然后当前分支前会添加一个*,然后我们的
3.git checkout dev 切换到目标分支上,比如我们要切换到dev的分支上
4.这时候对readme.txt文件进行修改,然后添加 提交 git add . ;git commit -m "我又提交东西了"
5.cat readme.txt 发现文件改变了
6.git checkout master 切换到主分支
7.cat readme.txt 发现文件又没有改变
8.git merge dev 将dev分支上的信息整合到主分支上
9.cat readme.txt 发现文件变成了改变后的状态
10.git branch -d dev 删除了分支
11.git branch 这时候查看分支,已经没有dev这个分支了
总结创建分支的命令如下:
- git branch 查看分支
- git branch name 创建分支
- git checkout name 切换分支
- git checkout -b name创建+切换分支
- git merge name 合并某个分支到当前分支
- git branch -d name 删除分支
2、如何解决冲突?
如下demo:
git checkout -b fenzhi 创建并转到分支上
-
修改文件readme.txt git add readme.txt git commit -m "this is wenjian"
git checkout master切换回去
-
修改文件readme.txt git add readme.txt git commit -m "this is wenjian"
git merge fenzhi 将两个分支合并
git status 出现了conflict (content) :merge conflict in readme.txt这种提示,表示有分支冲突
git status也可以看到提示冲突
1.<<<<<<<<<<<<< HEAD //表示主分支的内容
2.66666666666 //主分支提交的内容
3.----------- //分隔符
4.5555555555 //分支上提交的内容
5.>>>>>>>>>>>>>fenzhi //分支的名字你可以在文件里进行修改了,合并还是咋地,爱咋咋地
git commit -m "合并完之后再次提交"
git log这样你就看到了提交的各种历史记录
3、分支管理策略
合并分支 git一般来说是“fast forward”模式,这种模式删除分支,丢掉分支信息,我们用--no-ff这个来处理
- git checkout -b dev创建一个分支
- 修改文件,
- git add readme.txt (此时没有commit)
- git checkout master 这里切换到主分支上
-
git merge --no-ff -m "merge with no-ff" dev
合并两个分支,注意这里用到了 --no-ff 参数,表示禁用fast forward模式 - git branch -d dev 删除分支 执行结果会返回delete branch dev (was edee06c)edee06c的意思就是版本号
- git branch //检查是否删除成功
- git log --graph --pretty=oneline --abbrev-commit这句话我还没有分清各个的意思
- 但是8点执行下的,还能看到edee06c这个版本号,被删分支的版本号还在
分支策略:
一般来说,master都是比较稳定的一个版本,需要发布的版本,一般情况下不允许在上边干活,在新建的分支上干活,然后分支代码稳定后就可以合并到master上来
7、bug分支
每个bug都可通过一个分支来修复,修复完成够,合并各个分支,然后将临时分支删除了
业务场景如下:
- master是要发版的代码,然后dev是正在开发的代码(手动在dev的readme.txt中添加一行数据) 现在发现master上有个bug第一行需要添加一段代码,但是这个时候dev的代码还不能提交肿么办?
- 在dev的分支上 git stash 将目前的分支藏起来,这个时候git status就没有任何变化了,
- 然后新建一个分支 error 在error完成修改提交
- 回到主分支master上,进行合并,修复生产bug 删除error分支
- 回到dev的分支上,代码还是藏了开发代码后修复bug之前的代码
- git stash list 查看所有隐藏的代码
- 要恢复代码有两种方式 git stash apply /git stash pop
- 取出来后需要删除stash储存的东西 git stash drop