先用一张图来描述git的主要流程
![](https://img.haomeiwen.com/i6280690/dff8dfde8987e72a.png)
workspace: 本地的工作目录。
index:缓存区域,临时保存本地改动。
local repository: 本地仓库,只想最后一次提交HEAD。
remote repository:远程仓库。
配置用户名和密码
- git config -
- git config --global user.name "Your Name" => 设置自己的 Name
- git config --global user.email you@example.com => 设置自己的邮箱
- git config - - list 或者 查看git配置信息
- git config user.name 查看git用户名
- git config user.email 查看邮箱配置
远程仓库相关
- 修改远程仓库地址
方法1:
1. 进入git_test根目录
2. git remote 查看所有远程仓库, git remote xxx 查看指定远程仓库地址
3. git remote set-url origin [url]
方法2
1. git remote -v 查看指定远程仓库地址
2. git remote rm origin //移除之前关联的仓库地址
3. git remote add origin [url]
- 检出仓库
git clone git://github.com/jquery/jquery.git
- 查看远程仓库
git remote -v
分支相关
- 关联远程分支 将当前分支关联到远程release的V3.4.9分支 这样每次git pull 或者 git push jiu不用指定远程分支了
git branch --set-upstream-to origin/release/V3.4.9
- 查看分支
git branch #查看本地都有哪些分支
git branch -r. #查看远程都有哪些分支
git branch -a. #查看所有的分支,包括本地和远程的
- 创建分支
git branch dev. //本地创建分支
Git push origin dev; //将本地创建的dev分之推送到远程
git push origin master: dev //以master分支为基础,在远程新建一个dev分支
git checkout -b dev # 以当前分支为基础,新建并切换到dev分支
git checkout -b dev master #从master分支为基础,新建名为dev的新分支,并切换到dev分支上去
git checkout -b release/V1.0.6 origin/release/V1.0.6 #从远程release/V1.0.6分支为基础,新建名为release/V1.0.6 的新分支,并切换到release/V1.0.6 分支上去
- 切换分支
git checkout dev #切换到dev分支
git checkout -b V1.0.2 #以当前分支为基础,在本地创建V1.0.2的分支并切换到该分支
git checkout -b V1.0.2 master # 以master分支为己转新建V1.0.2分支并切换到V1.0.2分支
- 删除分支
git branch -d dev1 #删除本地的某个分支
git branch -D dev1 #如果没有完成合并时会有提示,可以采用强制删除
git push origin :dev1 #删除远程的分支 注意,冒号前面的空格不能少,相当于把一个空分支push到server上,等于删除该分支(注意:号后面不要加origin)。
- 合并分支
git merge dev #合并dev分支代码到本地分支(Fast forward模式,这种模式下删除分支后,会丢失分支信息)
git merge --no-ff -m "merge with no-ff" dev #-no-ff参数,表示禁用“Fast forward” 会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息
git rebase dev #衍合dev分支代码到本地分支
- 修改本地分支和远程分支名称名称
1.git branch -m V1.0.2 V1.0.2_new #修改本地分支名称
2.git push orign :V1.0.2 #删除远程v1.0.2分支
3.git push origin V1.0.2_new:V1.0.2_new #将本地V1.0.2_new分支推送到远程V1.0.2_new分支,远程不存在V1.0.2_new分支时会自动创建
更新和提交代码
- 从远程分支拉去代码到本地分支
git pull origin master #将远程master分支代码更新到本地,会自动merge(作用等价于 git fetch + git merge)
git fetch origin master #将远程master分支代码更新到本地,不会自动merge
- 推送到远程仓库
把本地的某个分支V1.0.0提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫dev的分支
git push origin master #本地代码提交到远程master分支
git push origin V1.0.0:master #将本地V1.0.0分支代码提交到远程master分支
git push origin V1.0.0:dev #将本地V1.0.0分支代码提交到远程dev分支
TAG相关
git tag 或者git tag —list : #查看所有tag
git tag v1.0 #以当前分支的最新commit打一个tag
git branch feature_dev v0.1 #以v0.1这个tag建一个名字为feature_dev的分支
git tag v0.9 ef51d63 #以ef51d63这个commit id打一个名为v0.9的tag
git tag -a v0.1 -m "version 0.1 released” 02172e4 #可以创建带有说明的标签,用-a指定标签名,-m指定说明文字 以02172e4这个commit id打一个名为v0.9的tag
git show v0.9 #查看标签信息
git tag -d v1.0 #删除标签
git push origin tagname #推送某个标签到远程
git push origin —tags 一次性推送全部尚未推送到远程的本地标签
git push origin :refs/tags/tagname #从远程删除标签
git tag -l “V3.1.*” 加上-l命令可以使用通配符来过滤tag
保存、恢复现场
git stash #保存当前的工作现场
git stash save "test-cmd-stash" #保存当前的工作现场,并加注释说明
git stash list 查看stash队列
git stash pop 恢复顶部的stash
git stash pop stash@{num} num 就是你要恢复的工作现场的编号 注意其对应的stash 在队列中删除
git stash apply stash@{num} 和pop唯一的区别是不会再stash队列中删除
Git stash apply 恢复stash list中所有的stash,stash内容并不删除,你需要用git stash drop来删除
Git stash clear 清空stash list
查看git提及历史
git log 查看历史提及记录
git log -p 查看详细历史
git log —stat 查看简要统计
git show 76ded63ae9149e06 查看某一个commitid具体的改动内容
删除未被git跟踪的文件
The following untracked working tree files would be overwritten by checkout:
.DS_Store
Please move or remove them before you switch branches.
进入本地版本仓库目录下,直接执行git clean -d -fx即可。可能很多人都不明白-d,-fx到底是啥意思,其实git clean -d -fx表示:删除 一些 没有 git add 的 文件;
git clean 参数
-n 显示将要删除的文件和目录;
-x -----删除忽略文件已经对git来说不识别的文件
-d -----删除未被添加到git的路径中的文件
-f -----强制运行
git clean -n
git clean -df
git clean -f
放弃修改
git revert 和 git reset的区别
- git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
- 在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。
- git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容
- 未进行add操作
git checkout -- readme.txt #撤销 readme.txt
git checkout . #撤销所有
- 已add但未commit
该命令相当于撤销 git add 的影响,在执行该命令后,本地的修改并不会消失,而是回到add之前的状态。
git reset HEAD readme.txt #放弃指定的文件的缓存
git reset HEAD #放弃所有修改的缓存
- add完之后,还commit了,但还没有push到远程仓库
git reset --hard #回退到上一次commit的状态
git reset --hard HEAD^ #回退到上一次commit的状态
git reset --hard HEAD^^ #回退到上上次commit的状态
git reset --hard HEAD~100 回退n个版本
git reset --hard commitId #回退到某个commitId的版本
- 已经push到远程仓库了
git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去
git revert HEAD #撤销前一个commit
git revert HEAD^ #撤销前前一次 commit
git revert commitId #撤销指定的某个commitId
添加版本控制和忽略版本控制
.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。
git update-index --assume-unchanged FILENAME. #忽略跟踪
git update-index --no-assume-unchanged FILENAME. #恢复跟踪
查看git历史
* git log #查看历史提及记录
* git log -p #查看详细历史
* Git log —stat #查看简要统计
* Git show commitId #查看某一个commitid具体的改动内容
其他操作
git cherry-pick commitId #把某个commit从一个分支放到另一个分支
git mv <oldFileName> <newFileName> #修改文件名称
git rm readme.txt #从版本库中删除文件
git 踩坑记录
- 在命令行中,在根目录下的.bash_profile中配置了以下脚本,按tab键也无法补全
if [ -f ~/.git-completion.bash ]; then
. ~/.git-completion.bash
fi
原因是 本地安装的git版本和 .git-completion.bash对应的版本是不一致的。我本地安装的git版本是v2.17.0 但是 .git-completion.bash文件中的内容对应的版本却不是v2.17.0。
解决办法是访问github上的git仓库地址(在地址栏替换下版本数字就能获取对应资源 例如将下面地址的v2.23.0替换成2.17.0)
https://raw.githubusercontent.com/git/git/v2.23.0/contrib/completion/git-completion.bash
- 新建并切换分支时报错 :git checkout -b release/V4.0.5 origin/release/V4.0.5
'origin/release/V4.0.5' is not a commit and a branch 'release/V4.0.5' cannot be created from it. 意思是origin/release/V4.0.5 不是一个提交或分支,解决办法是先执行git pull 把分支信息同步下来再执行 git checkout -b 命令
网友评论