个人blog,欢迎关注加收藏
Git 教程强烈推荐廖雪峰老师:Git教程
本地仓库
-
克隆版本
git clone url(版本库地址)http://...
-将仓库的文件clone到工作台 -
暂存文件
git add *
,git add把文件添加进去,实际上就是把文件修改添加到暂存区 -
提交本地
git commit -m'注释信息'
,实际上就是把暂存区的所有内容提交到当前分支,创建Git版本库时,Git自动为我们创建了唯一一个master分支
add/commit命令可合并成:git commit -am '提交说明’ -
提交远程
git push
–将文件提交到git创建的远程仓库中 -
更新版本
git pull
,将远程仓库的最新版本拉取到本地仓库,已有文件做了更改,对版本进行更新,确保是仓库中最新的内容 才能将自己的文件传送到远程仓库 -
查看工作区状态
git status -s
-
git diff
:查看版本库中提交的最新版本与工作区文件的差异,用git diff HEAD -- readme.txt
命令可以查看工作区的readme.txt文件和版本库里面最新版本的区别 -
git log --pretty=oneline
:查看日志,记录的是提交记录(vscode终端查看完后,英文状态下按q退出) -
第一次提交文件,初始化项目时
两个命令-
git config --global user.email “hubiyu@qq.com” //消息推送的通知邮箱
-
git config --global user.name “hubiyu” //设置使用者的名字
-
git config --system --unset credential.helper清除用户信息缓存,每次都需要输入密码
-
-
返回上一个版本:
git reset --hard HEAD^
- 首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是
HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
。 git log --pretty=oneline
可以查看提交记录的日志,会显示每个版本的版本号id,git reset --hard 版本号id
,只要知道版本号id,就可重置到任意版本,比如:git reset --hard c5aea218702d5afa335eadc1b1b5e5b99c1258a9
,版本号id可以不写全,git会自动匹配
- 首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是
-
git reflog
记录你的每一个git操作命令
- 当你从最新版本回退到了某个版本,关掉了电脑,后悔了,想恢复到最新版本怎么办?找不到新版本的commit id怎么办?
git reflog
查看所有操作记录
-
cnpm i
--配置node.js运行环境缺失的文件(node_modules) -
git checkout -- 文件名
:撤销修改,如:git checkout -- readme.txt
,这里有两种情况:- 一种是文件自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态(修改前的状态);
- 一种是文件已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
- 如果修改的内容已经
git add
到暂存区了,还没有提交,而你又不想要这部分修改,命令git reset HEAD <fileName>
可以把暂存区的修改撤销掉(unstage),重新放回工作区,git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。 - 总之,就是让这个文件回到最近一次git commit或git add时的状态,
git checkout -- 文件名
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。 git checkout -- file
命令中的--
很重要,没有--
,就变成了切换到另一个分支的命令
-
git checkout .
这条命令把 当前目录所有修改的文件 从HEAD中签出并且把它恢复成未修改时的样子.- 注意:在使用 git checkout 时,如果其对应的文件被修改过,那么该修改会被覆盖掉。
-
拉取分支:
git checkout -b 分支名(本地分支名) origin/分支名(远程仓库分支名)
:分支名可以保持一致,如:git checkout -b master origin/master
-
删除文件:
git rm <filename>
,如:git rm test.txt
,删除文件后git工作区会标红,是因为工作区删除了test.txt文件,而版本去还存在该文件,两个区域不同,则报红,执行git commit -m 'remove file'
即可
远程仓库
- 由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置,本地仓库与远程仓库之间添加
ssh key
可参考GitHub ssh key 配置 - 关联本地仓库和远程仓库:
$ git remote add 远程仓库的名字 远程仓库的地址
,如:$ git remote add origin git@github.com:michaelliao/learngit.git
,远程库的名字就是origin
,这是Git默认的叫法,也可以改成别的 - 删除与远程仓库的关联:
git remote remove 远程仓库的名字
- 将本地仓库的内容推送到远程仓库:
git push -u 远程仓库名 本地分支名
,如:git push -u origin master
;实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令git push origin master
。 git remote set-url origin git@github.com:michaelliao/learngit.git
,直接将本地仓库关联的远程仓库路径切换到另一个模块michaelliao/learngit
git remote prune origin
,清理无用的远程分支(不会影响本地分支)git clone 远程仓库地址
,从远程克隆一份项目到自己本地
分支管理
- 创建分支:
git checkout -b 本地仓库分支名
或者git switch -c 本地仓库分支名
,如:git checkout -b dev
或git switch -c dev
- 创建分支并关联远程分支:
git checkout -b 本地分支名 远程分支名
,如:git checkout -b dev origin/dev
,创建了本地分支dev并关联远程分支dev(远程仓库origin下的分支dev),本地和远程分支的名称最好一致 - 查看分支:
git branch
- 切换分支:
git checkout 本地分支名
或git switch 本地分支名
,如:git checkout master
或git switch master
- 合并分支:
git merge 本地分支名
,如:git merge dev
,命令用于合并指定分支到当前分支- 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息,
git merge --no-ff -m "commit message" 本地分支名
,请注意–no-ff参数,表示禁用Fast forward,因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
- 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息,
- 删除分支:
git branch -d 本地分支名
,如git branch -d dev
,强制删除:git branch -D 本地分支名
,如:git branch -D dev
git log --graph
查看分支合并图git stash
将当前工作现场储藏起来,等以后恢复继续工作git stash list
查看储藏列表
git stash apply stash@{位置下标}
,如:git stash apply stash@{0}
- 用
git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;另一种方式是用git stash pop
,恢复的同时把stash内容也删了,但不能恢复指定的stash
git cheryy-pick 提交版本号
可以讲指定的提交所做的修改复制到当前分支,如:git cherry-pick 336c5
,在dev分支上修改bug提交,提交版本号为336c5
,dev分支也是从master分出去的,即bug也存在于master分支,将修复dev上该bug的提交复制一份到master分支git remote
查看远程仓库的信息,git -remote -v
可以查看远程仓库详细的信息
10.推送分支:git push 远程仓库名 本地分支名
,如:git push origin master
,如果需要推送其他分支dev:git push origin dev
- 拉取代码:
git pull
,第一次抓取代码时,会有以下提示,原因是没有指定本地dev分支与远程origin/dev分支的链接
* git branch --set-upstream-to <branch-name> origin/<branch-name>
,如: git branch --set-upstream-to=origin/dev dev
,根据提示链接分支,再拉取代码:git pull
* git pull
时提示git Auto packing the repository in background for optimum performance. See "git help gc" for manu...
,是自己本地一些 “悬空对象”太多(git删除分支或者清空stash的时候,这些其实还没有真正删除,成为悬空对象,我们可以使用merge命令可以从中恢复一些文件),解决方法: 1. 输入命令:git fsck --lost-found
,可以看到好多“dangling commit” ,2.清空他们:git gc --prune=now
,完成
- 多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果
git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。 - 如果合并有冲突,则解决冲突,并在本地提交,冲突如下:
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
标签
- 查看所有标签:
git tag
- 创建标签:
git tag tagName
,为当前分支上的最新一次提交版本打上标签,如:git tag v1.0
- 指定提交版本创建标签:
git tag tagName 版本号
,在当前分支指定的提交版本上打上标签,如:git tag v0.0 4f5e5aded587c22b9ed696c2ede0bd309a8cde32
- 展示标签信息:
git show tagName
,展示标签所标记的此次提交相关的所有信息,如:git show v1.0
- 带参数的创建标签:
git tag -a tagName -m '标签说明' 版本号
,-a
参数可以指定标签名,-m
可以添加标签说明,如:git tag -a v2.0 -m '这是2.0版本' c5aea218702d5afa335eadc1b1b5e5b99c1258a9
- 删除标签:
git tag -d <tagName>
,删除本地所有tag:git tag -l | xargs git tag -d
或者git tag -d $(git tag)
- 推送tag到远程仓库:
git push 远程仓库名 tagName
,如:git push origin v1.0
- 同时推送所有tag:
git push 远程仓库名 tags
,如:git push origin tags
- 如果要删除远程仓库的tag:
- 先删除本地的tag:
git tag -d tagName
- 删除远程仓库的tag:
git push 远程仓库的名字 :refs/tags/tagName
,如:git push origin :refs/tags/v0.0
- 先删除本地的tag: