git命令
本地仓库
-
git init
初始化一个文件夹为git仓库 -
git add 文件名
把文件夹里的文件添加到仓库(把文件放到暂存区) -
git commit -m "描述提交内容给"
把文件提交到仓库,并添加提交内容的相关描述(把暂存区的文件提交到当前分支) -
git status
查看此时的仓库状态,判断是否有文件被修改过. -
git diff 文件名
当git status 查看到有文件变动个,用git diff命令可以查看具体修改内容,然后可放心的提交到仓库. -
git log
可以查看提交日志,如果log日志眼花缭乱,可以试试加上--pretty=oneline
参数 -
git reset --hard 版本id
命令可以指定当前版本为指定id的版本,Head
指定的就是当前版本.版本id可写前几位.查看id的方法: 1.git log 2.git reflog -
git reflog
查看历史的版本id,此命令是记录git的操作的. -
回退版本也可以写成
git reset --hard HEAD~数字
其中数字可以是几就回退几个版本. -
git checkout -- 文件名
让文件回复到最后一次add或者 commit时的状态(执行了git add 操作又做了修改 或者执行了git commit又做了修改,此命令都可以把修改删除回到之前执行add或commit的状态)场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- 文件名
。场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD 文件名
,就回到了场景1,第二步按场景1操作。场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,可以回退版本,不过前提是没有推送到远程库。
-
git rm 文件名
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。 -
命令
git rm
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
远程仓库
上传
本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
第1步:创建SSH Key。
- 在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有
id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
ssh-keygen -t rsa -C "youremail@example.com"
id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面,然后点“NEW SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容.
第3步:右上角找到“Create a new repo”按钮,创建一个新的仓库,在Repository name填入learngit
,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库
第4步:根据git页面的命令提示,就可以将本地git仓库推送到远端了.
git remote add origin git@server-name:path/repo-name.git
git push -u origin master
- 由于远程库是空的,第一次推送
master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。 - 推送成功后,可发现github和本地一模一样
- 只要本地作了提交,就可以通过命令
git push origin master
做提交 - 推送分支
git push origin 分支名称
下载
git clone 地址
分支管理
创建与合并分支
-
添加分支
git checkout -b 分支名称
git checkout
命令加上-b
参数表示创建并切换,等同于
git branch 分支名称 git checkout 分支名称
-
git branch
命令查看当前分支 -
然后执行 add 和 commit 命令
-
当分支工作完成 切换到主分支上
git checkout master
并且把分支上的内容合并到主干上git merge 分支名称
-
git merge 分支名称
命令用于合并指定分支到当前分支。 -
合并完成后,就可以放心地删除分支
git branch -d dev
解决冲突
- 当在分支上开发时候文件做改动了,也提交到本地仓库了,又切换到主分支上,此时还没有合并分支,而又在主分支上改动了文件,也提交到本地仓库了,此时又想分支合并到主分支上,就会有冲突了.——这是其中一种冲突
- 必须手动解决冲突后再提交。
git status
也可以告诉我们冲突的文件 - Git用
<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,打开文件手动修改,留下真正需要的,然后保存 - 再执行 add 和 commit 提交到本地仓库
- 最后在删除分支
git branch -d 分支名称
git log --graph
命令可以看到 分支合并图
分支策略
-
通常,合并分支时,如果可能,Git会用
Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。 -
如果要强制禁用
Fast forward
模式,--no-ff
参数使Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。 -
新开分支干活,
git checkout -b 分支名称
, 做完操作(增删改…)并且也提交了然后切换到主分支上git chekout master
然后准备合并分支内容. -
git merge --no-ff -m "提交信息描述" 分支名称
合并分支,--no-ff
参数,表示禁用Fast forward
本次合并要创建一个新的commit,所以加上-m
参数,把commit描述写进去。 -
分支开发 主干发布.在实际开发中,应该按照几个基本原则进行分支管理:
首先,
master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;那在哪干活呢?干活都在
dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;每个人都在
dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。 -
总结:开发一个新功能,最好新建一个分支;
-
当在新分支开发的功能不需要了就不用合并了.不合并删除的话会报错,如果要丢弃一个没有被合并过的分支,可以通过
git branch -D <name>
强行删除,用大写字母D.
bug分支
-
如果有需求正在分支上开发,突然之前的功能有bug,此时需要在建立一个bug分支,去修改,但是这个需求还需要点时间完成不能提交(提交可能会造成其他人的工作问题). git不允许 不提交内容就切换分支.
-
Git还提供了一个
stash
功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作. -
执行
git stash
命令可以将分支修改存储起来.然后可以切换分支了 -
bug的产生一般都是主分支master(产生在上线的分支),就在主分支再建立分支修改bug 修改完成后合并到主分支.然后可以继续到开发分支里完成相应功能了
-
到了开发分支 通关
git stash list
可以查看存储的修改 -
一是用
git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;另一种方式是用
git stash pop
,恢复的同时把stash内容也删了 -
git stash pop
恢复之前的修改 同时把stash内容删除 -
可以多次stash,恢复的时候,先用
git stash list
查看,然后恢复指定的stash,用命令:git stash apply stash@{0}
-
实测 在开发分支不修改 已在主分支修改的bug ,合并到主分支时 不会有冲突, 主分支是 修改bug后的+开发分支上的内容. 如果在开发分支上也修改了bug 修改的不同的话 会产生冲突.
多人协作
- 确定是否有推送权限
git remote -v
如果有 push 地址就可以推送 git remote
可以查看远程仓库名称- 不是所有的分支都需要往远程仓库推送,一般 开发分支 和 主分支推送到远端仓库, bug分支可以不推送.根据情况而定
git pull 远程仓库名称 当前分支名称
拉取远程的内容. 一般提交前都会pull一下.防止冲突.- 当你推送到远端时报错,可能远端版本高于本地当时推送的版本,那就pull一下,
git rebase
操作可以把本地未push的分叉提交历史整理成直线; - rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
标签
由于版本id(commit id) 太过于长不容易表述,可以设置个标签来表示一版本或者是同一类事物用共同标签
创建
- 命令
git tag <tagname>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id; - 命令
git tag -a <tagname> -m "blablabla..."
可以指定标签信息; - 命令
git tag
可以查看所有标签
删除
-
git tag -d 标签名称
可以删除指定标签 -
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
如果要推送某个标签到远程,使用命令
git push origin <tagname>
-
一次性推送全部尚未推送到远程的本地标签:
git push origin --tags
-
要删除远程标签,先删除本地标签,然后执行命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。