目录
前言
一、Git是什么?与其它类似版本控制的不同点?
二、使用步骤
1.安装
2.命令学习记录
总结
学习git应用的命令,以便日后忘记进行快速回顾查找。
Git是目前世界上最先进的分布式版本控制系统。CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。Git的优势不单是不必联网这么简单,还有Git极其强大的分支管理。
可以在官网进行安装,具体安装教程参考Git 详细安装教程(详解 Git 安装过程的每一个步骤)_mukes的博客-CSDN博客_git安装
安装完成后可以使用以下命令设置Git仓库信息
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
以下命令可进行查看
$ git config user.name
$ git config user.email
创建版本库并初始化添加文件
$ mkdir learngit 选择一个合适的地方,创建一个空目录
$ cd learngit
$ pwd 显示当前目录
$ git init 把这个目录变成Git可以管理的仓库
$ git add readme.txt 把文件添加到仓库(文件要放在创建的空目录下),可添加多个文件后直接跟文件名
$ git commit -m "write a readme file" 把文件提交到仓库
文件管理命令:
$ git log 查看提交记录
$ git reset --hard HEAD^ 回退到上个版本(HEAD~10代表回退到上10个)
$ cat readme.txt 查看文件内容
$ git reset --hard xxx(版本id) 可指定回到未来的版本
$ git reflog 记录命令历史
工作区和暂存区
创建的空目录就是一个工作区
暂存区如图添加和提交后的一个状态
$ git status 查看状态
$ git diff HEAD -- readme.txt 查看工作区和版本库里面最新版本的区别
$ git checkout -- readme.txt 丢弃工作区的修改
$ git reset HEAD readme.txt 把暂存区的修改撤销掉(unstage),重新放回工作区(之后要执行丢弃工作区的修改命令)
ps:假如提交到版本库的话就要执行版本回退命令了(切记不要提交远程仓库,除非无任何问题)
原来的git checkout 可以使用 git restore 代替
原来的git reset HEAD 可以使用 git restore --staged 代替
原来的git checkout branchName 可以用 git switch branchName 代替
最新版的git提示都已经更换成了restore
从暂存区恢复工作区,
git resotre --worktree readme.txt
从master恢复暂存区
git restore --staged readme.txt
从master同时恢复工作区和暂存区
git restore --source=HEAD --staged --worktree readme.txt
$ rm test.txt 删除工作区文件
$ git rm test.txt 从版本库中删除该文件
$ git checkout -- test.txt 恢复工作区文件(版本库中文件删了就无法恢复了)
新版本 git version 2.35.1.windows.2
对于文件删除操作使用git restore --staged
来丢弃暂存区该次删除操作, 在git checkout --
远程仓库
首先,创建SSH Key。在用户主目录下(windows的.ssh目录c盘:/user(或者是用户)/你的用户名(你自己之前起过的)/.ssh),看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa(私钥,勿泄露)
和id_rsa.pub(公钥,可开放)
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"
把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
然后,登陆GitHub,打开“Account settings”,“SSH Keys”页面:点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容:
点“Add Key”,你就应该看到已经添加的Key了。
添加远程仓库
在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作。
首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,在Repository name填入仓库名
,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。在本地的learngit
仓库下运行命令:
$ git remote add origin [email protected]:michaelliao/learngit.git 远程库的名字就是origin,这是Git默认的叫法
$ git push -u origin master 把本地库的所有内容推送到远程库上,第一次推送master分支时(遇到警告就输yes,建立ssh信任连接),加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令$ git push origin master
$ git remote -v 查看远程库信息
$ git remote rm origin 根据名字删除(也就是解除与远程库的链接)
假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。首先,登陆GitHub,创建一个新的仓库,名字叫gitskills
:
我们勾选Initialize this repository with a README
,这样GitHub会自动为我们创建一个README.md
文件。之后进行克隆:Git支持多种协议,包括https
,但ssh
协议速度最快。
$ git clone [email protected]:michaelliao/gitskills.git
查看是否克隆到本地库:
$ cd gitskills
$ ls
分支管理
查看分支:git branch
创建分支:git branch
切换分支:git checkout 或者git switch
创建+切换分支:git checkout -b 或者git switch -c
合并某分支到当前分支:git merge (若合并失败,手动修改文件进行提交后方可删除分支)
分支的合并情况 git log --graph --pretty=oneline --abbrev-commit
删除分支:git branch -d
$ git branch -D 强行删除,需要使用大写的-D参数
分支管理策略
$ git merge --no-ff -m "merge with no-ff" dev
准备合并dev分支,--no-ff参数,表示禁用Fast forward
git config branch.master.mergeoptions "--no-ff" 仅针对当前分支有效
git config --add merge.ff false 仅针对当前版本库的所有分支有效
git config --global --add merge.ff false 仅针对所有版本库的所有分支有效
bug分支
当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101
来修复它,但是,当前正在dev
上进行的工作还没有提交:
$ git stash 可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支:
切换到master分支并创建bug分支,修改后进行commit提交并切换到master进行合并后删除bug分支
回到原来工作的分支
$ git stash list 查看工作清单
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
$ git stash apply stash@{0}
可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令
同样的bug,要在dev上修复,我们只需要把4c805e2 fix bug 101这个提交所做的修改“复制”到dev分支。注意:我们只想复制4c805e2 fix bug 101这个提交所做的修改,并不是把整个master分支merge过来。
为了方便操作,Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支:
$ git branch
* dev
master
$ git cherry-pick 4c805e2
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick 命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
多人协作
首先,可以试图用git push origin
推送自己的修改;(要连接远程库)
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull
试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to
。
$ git clone [email protected]:michaelliao/learngit.git 克隆远程库
$ git pull origin master --allow-unrelated-histories 允许不相关历史提,强制合并
Rebase
如果git pull后提示有冲突后,先不管冲突的代码,因为修改后执行rebase还是变回有冲突的代码。先执行git add . 和 git commit -m 'xxx'。在执行git rebase 终端提示:Resolve all conflicts manually, mark them as resolved with "git add/rm
(详解可借鉴此博客git merge 与 git rebase的区别_Michaelliu_dev的博客-CSDN博客_merge和rebase区别)
创建并操作标签
$ git tag v1.0 创建标签
$ git tag 查看标签
$ git log --pretty=oneline --abbrev-commit 查看提交历史
$ git tag v0.9 f52c633 根据id打标签
$ git show v0.9 查看标签信息
$ git tag -a v0.1 -m "version 0.1 released" 1094adb 给某个id添加解释并创建标签 -a指定标签名,-m指定说明文字
$ git tag -d v0.1 删除本地标签
$ git push origin :refs/tags/v0.9 删除远程库标签(要先删本地)
$ git push origin v1.0 推送远程库标签
$ git push origin --tags 一次性全部推送到远程库
使用github
有三个仓库,local(本地的),origin(远程你自己的) 和 upstream(远程别人的)。
使用gitee
使用Gitee和使用GitHub类似,我们在Gitee上注册账号并登录后,需要先上传自己的SSH公钥。选择右上角用户头像 -> 菜单“修改资料”,然后选择“SSH公钥”,填写一个便于识别的标题,然后把用户主目录下的.ssh/id_rsa.pub
文件的内容粘贴进去。
在Gitee上创建一个新的项目,名称最好与本地库保持一致:然后,在本地库上使用命令git remote add
把它和Gitee的远程库关联。就可以正常地用git push
和git pull
推送了。
注:远程库的名称最好与远程地的名称相同,防止名称冲突报错
自定义Git
参考自定义Git - 廖雪峰的官方网站
通过学习廖雪峰老师的git教程,目前能基本操作如何去用git连接远程库进行实操,收货很大,特以此记录,方便日后翻阅回顾。附教程:Git教程 - 廖雪峰的官方网站