您现在的位置是:首页 > 技术学习 > Git 网站首页 技术学习 Git
Git 常用命令
- 技术学习
- 2019-05-08
- 423已阅读
- 0
git管理的工作流程:
工作区 -> 暂存区 -> 分支 (暂存区和分支属于版本库)
工作区通过add可以将文件加进缓存区,缓存区通过commit可以到当前分支
工作区: 我们电脑中的文件夹,我们操作文件是在工作区操作。
版本库: 工作区里面隐藏的.git目录。
暂存区: 属于版本库,用于暂存工作区add进来的新文件,和发生修改的内容。
分支:属于版本库,可以理解为记录并连接所有提交的时间线,可有多条分支,HEAD是一个指针,表示当前版本,用于指定当前处于哪个分支的哪次提交上面,默认是在最近一次,可以指定特定的提交。
个人理解:一个版本库相当于5维空间,分支相当于4维空间(时间线),每次的commit是三维空间(时间点),每次commit下的文件是2维空间,文件里面的内容属于1维空间。我们(
HEAD)可以切换到任意分支(时间线)的任意commit(时间点),还可以查看该次commit(时间点)下修改的文件和内容
1. 本地管理
首先我们需要进入到要管理的文件夹下。进入方法 -> 在终端输入: cd 文件夹路径
然后回车即可进入 (windows系统可以用git-bash进行git操作)
1-1 创建版本库 git init
git init
该命令是将当前文件夹变为git可以管理的仓库,
创建完成会在目录下生成.git目录,为隐藏目录。用来跟踪管理版本库的。
1-2 查看文件夹下文件状态 git status
git status
该命令可以查看git管理的当前文件夹下文件的状态。常见状态:
1. fatal: Not a git repository 报错,该文件夹没被git管理
2. Untracked files: 未被管理的文件,可以用git add将其管理起来
3. Changes to be committed: 文件已暂存,由工作区进入暂存区,
两种形式的文件:
modified:发生修改的文件
new file :新增的文件
4. Changes not staged for commit: 已管理的文件发生了修改,但没有提交。
5. nothing to commit, working tree clean 工作区是干净的,即没发生修改。
1-3 查看修改内容 git diff
git diff 或者 git diff 文件名
查看修改的内容(工作区和缓存区快照进行对比),前者查看所有修改,后者针对某文件查看相应的修改。
注: 该命令必须使用在git add之前,add后不能查看修改了就。
1-4 添加文件 git add
git add 文件名 或者 git add -A
将修改的文件或者将未被管理的文件加进暂存区,前者是添加指定文件,后者是添加所有文件
1-5 撤销修改
git checkout -- 文件名
撤销该文件在工作区的修改,不影响暂存区,该命令不能撤销已加入暂存区的修改,
(其实是用暂存区里的版本替换工作区的版本,一键还原),
注:文件名前有空格。
git reset HEAD 文件名
撤销暂存区的修改,重新放回到工作区
1-6 提交修改 git commit
git commit -m "对修改的描述"
提交暂存区内容,使用在git add 之后
git commit -a -m "对修改的描述" 或 git commit -am "描述"
可将工作区修改完或删除的文件直接提交,相当于add和commit组合,
但是对新增的没被tracked的文件不能这样用,必须先add再commit
git commit --amend
在push到远端之前,可以在不更改commitId的前提下,修改最近一次的commit 信息,也能修改提交的内容。
执行命令后会进入 注释页面 的 vm模式, 在里面可以修改commit信息 和提交的内容,修改完保存退出即可。
如果已经push到远端,那么再次push时候需要执行 -f 强制推送
1-7 查看管理日志 git log
git log
查看当前分支的提交记录
(只显示当前所在commit以及之前的commit信息,版本回退后,回退版本之后的提交信息不显示)
参数:
1. -n(n为正整数)
查看最近几次的提交信息
2. --pretty=格式名
用指定格式来显示每次的提交,有oneline、short、medium(默认值)、full、fuller、raw等,
3. --author=作者名
查找指定作者的提交
4. -p
展开显示每次提交的内容差异
5. -stat
简要显示每次提交文件增改行数
6. --grep=过滤用的字符
找到所有提交描述里包含该字符的提交
git reflog
显示你的每一次命令,并且可以显示出所有操作对应的提交的commit id,
这样即使进行版本回退(从现在回到过去),也可以通过该命令找到回退版本之后的commit id,
然后就可以从过去回到现在
注:有时候会遇见git log 中文乱码的问题,解决办法
git config --global i18n.commitencoding utf-8
git config --global i18n.logoutputencoding utf-8
export LESSCHARSET=utf-8
1-8 显示提交的修改内容 git show
git show [options] <options>...
显示一个或多个对象(可以是:blobs,树,标签和提交)。
git show
展示当前commit修改的内容(和上个commit做对比)
git show commitID
展示指定commit做了哪些修改
git show 标签名
展示指定标签及指向的对象
1-9 版本回退 git reset/git revert
git reset --hard HEAD^
回退到上个版本,^代表上一个,^^代表上上一个,以此类推,HEAD~66代表回退到往前66个版本。
git reset --hard 想要回退的版本commit id
回退到指定的版本,commit id不用写全,写前几位就行,git会自动寻找,也不能太少不然可能找出多个版本
git revert 回退的版本commitId
是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
git reset 和 git revert 的区别:
git reset 是直接回退到指定commit进行版本回退,
而 git revert 是回退到指定的commit,然后在其上覆盖新的commit。
push完再进行版本回退后的提交问题:
使用 git reset 回退后在push,会提示本地版本低于远端,push失败,除非使用 --force 强制push。
使用 git revert 回退后再push则不会提示本地版本低于远端,因为revert是在回退之上加了新的commit。
1-10 删除文件 git rm
git rm 文件名
从暂存区删除该文件。
git rm --cached 文件名
清除该文件缓存,让文件或目录不再被git管理。
如果我们需要在.gitignore里面添加一个已经被管理过的文件或目录的时候,
需要执行这个命令,不然该目录还会被git管理。
1-11 分支
git branch
查看分支信息,当前分支前有个*号
git branch -a
查看所有分支,包括远端分支,远程分支用红色显示
git branch -r
查看所有的远端分支,搭配 git remote update 可以查看当前所有远端分支
git branch 分支名
创建一个新分支
git branch -m 旧分支名 新分支名
重命名分支
git branch --set-upstream-to=远端仓库名/远端分支 本地分支
将本地指定分支和远端指定分支关联(追踪),这样pull、push的时候不用再指定分支了。
# git branch --set-upstream 本地分支 远端仓库名/远端分支
不再支持,请用 --set-upstream-to
将本地分支追踪到远端分支,方便 pull 和 push 等操作
例:
省略远端分支名 git pull origin
如果只有一个追踪分支,可以省略仓库名 git pull
git checkout 分支名
切换到该分支下
git checkout -b 分支名
创建新分支,并切换到该分支。
git checkout -t origin/远端分支
在本地 pull 并 切换到对应的远端分支
1-12 删除分支
git branch -d 分支名
删除本地该分支,如果本地分支没有被合并会报错
git branch -D 分支名
强制删除本地分支,即使没合并也会被删除
git push origin --delete 远程分支名
删除指定远程分支
git push origin :远程分支名
推送一个空分支到远程分支,其实就相当于删除远程分支
1-13 合并分支一 git merge
git merge 指定的分支名
合并指定的分支到当前分支,git会优先使用Fast-forward模式。
合并成功:(没冲突)
所在分支仍为当前分支,但是指针停留在指定分支的最新提交上。
(相当于把指定分支所有提交加在当前分支提交之后,并将指针移向合并后最新的提交)
合并失败:(有冲突)
解决冲突后需要重新add和commit,重新commit会生成一个新的commit,
git merge 远程仓库名/远程分支名
合并远程分支到当前本地分支
git merge --no-ff -m "信息描述" 分支名
合并指定的分支到当前分支,--no-ff强制禁用Fast-forward模式,
此时在合并时会在当前分支生成一个新的commit,-m "描述"是用来描述该次commit的。
合并成功后指针停留在新生成的commit上,而不再是停在指定分支的最新commit上。
(两个分支在此commit处交叉,各个分支的commit还在原分支上面)
注:
merge合并。内容合并后,各分支的提交信息还在相应的分支上,如果删除某分支,则该分支上相应的提交将丢失。
rebase合并后,分支合并为1个,提交信息都在合并后分支上面
1-14 合并分支二 git rebase
git rebase 指定分支名
合并指定分支到当前分支。会先将当前分支提交删除,提交信息暂存在rebase里。
然后把指定分支合并到当前分支上,然后再把当前分支做的更改和提交重新加上去。
(先同步指定分支提交,在加上当前分支提交)
git rebase -i HEAD~3
合并3个commit(HEAD和之前的两个)为一个commit,
之后3个commit会以倒序依次排列,最上面的是最早的提交。
将第2,3个提交前面的pick改为s或squash,保存退出。
然后会看到3次的提交信息描述,将其修改为合并后的描述,保存退出。
注:
git rebase 相关操作过程中,
可以随时使用git rebase --abort来中断并恢复到之前的样子。
git rebase --continue用来继续之前的合并。
使用此功能时一般是在push之前,
因为如果有commit已经push,此时将该commit和别的合并,在push会报错。因为会和远端冲突
1-15 保存当前分支工作现场 git stash
git stash
将当前分支工作现场(工作区和暂存区)暂时保存起来,并使工作区和暂存区变干净。
此时可进行其他工作。可进行多次保存。
git stash list
查看当前分支保存的工作现场列表。
git stash apply
当别的工作做完提交后,可用该命令恢复之前保存的工作现场。但是stash内容并不删除。
git stash apply stash列表中的某次保存
恢复到指定的stash,例:git stash apply stash@{0}
git stash drop
删除保存的工作现场
git stash pop
恢复工作现场,并再恢复的时候把stash内容删掉。
切换分支后该方法扔可以用,所以可以用该方法将分支上做的修改切换到另一个分支。
将分支做的修改stash,然后切换到另一个分支 pop 即可
1-16 标签 git tag
git tag
查看所有标签,按字母顺序列出,不是时间顺序。
git show 标签名
查看指定标签的信息
git tag 标签名
打一个指定名字的新的标签(默认打在最新的提交上面)
git tag 标签名 指定的commitid
在指定的commit上面打一个指定名字的新标签
git tag -a 标签名 -m "描述信息" 指定commitid
给指定提交打一个带描述信息的指定的标签名。-a指定标签名,-m描述说明
git tag -d 标签名
删除指定标签
git push origin 标签名
推送某标签到远程
git push origin --tags
推送所以没推送的标签
git push origin :refs/tags/标签名
删除远程标签,前提是先在本地删除本地标签
2. 远程仓库
git还能把本地仓库和远端关联,这样可以实现同步,而且还能实现多人协作。由于本地仓库和远程仓库的传输需要经过ssh加密,因此,我们需要设置SSH Key。常用远程仓库有Github、码云、bitbucket
2-1 和本地电脑建立关联
1. ssh-keygen -t rsa -C "邮箱地址"
创建成功会生成一个隐藏文件夹.ssh,
mac下在用户主目录下,
windows在用户->admin下。
里面包含三个文件,其中的id_rsa是私钥文件(不外泄),id_rsa.pub是公钥文件(可公开)。
2. 打开id_rsa.pub文件,复制里面的内容到远程SSH keys界面里的key里面,
起一个title名,远端可添加多个SSH Key。
点击保存即让本地电脑和远程建立连接,这样远程可知道推送信息的是谁。
2-2 建立远程仓库
在远程上面新建一个项目,建好后会有一个ssh链接。用于和本地仓库建立关联或用于clone。
2-3 本地仓库和远程仓库建立关联
- 首先在本地建好仓库,即被git管理的文件夹。(方法见上面的 本地管理 )
- 在本地终端中进入本地仓库下,输入:
git remote add 远程仓库名 版本库网址
git remote add origin 远程的ssh链接
注:
origin是远程仓库名字,一般远程库默认名字都叫origin。
可以改为别的,如果一个本地要关联多个远程,就要起不同的远程库名字,不然会冲突
2-4 克隆远程仓库git clone
git clone 远程库地址
克隆指定远程仓库到本地,本地生成的文件名和远程仓库名一样
git clone 远程库地址 本地目录名
克隆指定远程仓库到本地,并使用自定义的目录名
git clone -o 远程主机名 远程库地址
-o 参数后面是 远程主机名,默认是 origin, 可以指定特定的远程主机名
注:
git clone支持多种协议,包括:HTTP(s)、SSH、Git、本地文件协议等
2-5 查看远程主机信息git remote
git remote
查看远程版本库名 // origin
git remote -v
查看远程仓库详细信息,包括抓取和推送的地址,若没有push权限,则不显示push地址。
git remote update
更新当前所有远端分支的信息
git remote show 远程仓库名
查看指定远程仓库的详细信息
git remote show origin
# 查看origin远程仓库的详细信息
2-6 删除远程关联
git remote remove origin
删除和origin远端的关联
git remote rm 远程仓库名
删除远程仓库的关联
git remote rename 原仓库名 新仓库名
重命名远程仓库
2-7 拉取远程更新到本地 git fetch
拉取远程的更新,不影响本地的代码。
如果要在本地查看远程的更新,需要使用 “远程仓库名/远程分支名” 的形式去查看或操作
例:git merge origin/test 将远程分支的合并到当前分支
git fetch 远程仓库名
拉取远程所有分支的更新到本地
git fetch origin
# 将origin下的所有分支拉到本地
git fetch 远程仓库名 远程分支名
拉去远程仓库下指定分支的更新到本地
2-8 抓取远程更新git pull
git pull
抓取远程仓库所有分支更新并合并到本地。git pull = git fetch + git merge
git pull --rebase
抓取远程仓库的更新,在此基础上将自己的修改加上去。
git pull --rebase = git fetch + git rebase。
如果发生冲突,会让停止rebase,解决完冲突后用git add更新内容,
然后执行git rebase --continue。
git pull --no-ff
抓取远程仓库所有分支更新并合并到本地,不要快进合并
git pull 远程仓库名 远程分支名:本地分支名
将指定远程分支拉取并合并到指定本地分支
例:git pull origin master:dev
git pull 远程仓库名 远程分支名
将远程仓库指定分支合并到当前分支
git pull -p
-p 参数:在本地删除远程已经删除的分支
等同于:
git fetch --prune origin
git fetch -p
2-9 推送到远程 git push
git push -u origin master
将本地仓库当前分支推送到origin远程库的master分支,
当远程仓库是空时,第一次推送需要加上-u参数,指定origin远程库为默认主机,之后可以用简化推送指令。
当前分支和多个仓库存在追踪关系的话,-u 参数可以指定默认主机,默认追踪的分支可以使用简化指令
git push origin master
将本地仓库当前分支推送到origin远程库的master分支
git push
将当前分支推送到默认主机
git push origin 远程分支名
将本地当前分支推送远程指定分支,如果远程分支不存在,则在远程创建该分支
git push origin 本地分支名:远程分支名
将本地分支推送至远端,并把 本地指定分支 作为 远端指定的分支
如果左边本地分支为空,那么将删除后面的远端分支名
git push origin :远程分支名
删除远程指定分支
git push origin --delete 远程分支名
删除远程指定分支
git push --all origin
将本地所有分支推送到origin远程库。
git push origin --tags
将标签也推送至远程库,git push默认不会推送标签tags,需加--tags参数
git push origin HEAD
将当前分支推送至origin远程库下的同名分支
其他参数:
-f 或者 --force
强制推送并覆盖远端,有时候本地版本回退后,再push会提示本地版本behind远端,不让push,
这时候在push命令中加 -f 可强制将本地内容push到远端并覆盖远端原有内容。
注:
慎用,特别是多人协作的时候,尽量别用-f。
相关文章
-
暂无相关文章