什么是git
git是一个分布式版本控制系统,能够跟踪文本文件的改动,结合对应的命令实现代码版本的控制。
如何创建git环境(linux和Windows都适用)
- 首先,选择一个合适的地方,创建一个空目录(如GitTest目录)
- 第二步,通过git init命令把这个目录变成Git可以管理的仓库:git init
- 第三步,创建任意一个文件在GitTest目录下(如readme.txt文件,建议使用VS Code创建)
- 第四步,把readme.txt文件放到git仓库。
- 用命令git add告诉Git,把文件添加到仓库:git add readme.txt
- 用命令git commit告诉Git,把文件提交到仓库:git commit -m “wrote a readme file”。此处"-m"后面输入的是本次提交的说明,建议尽量书写有解释意义的说明。
(ps:为什么add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件)
git功能
workspace:工作区
staging area:暂存区/缓存区
local repository:版本库或本地仓库
remote repository:远程仓库
版本回退
每次修改了readme.txt,以上的add,commit可以再次使用,不断对文件进行修改,然后不断提交修改到版本库里。我们可以通过git log查看这些修改记录:git log或者 git log --pretty=oneline(后面这个更加简洁)。
$ git log --pretty=oneline
fd2f59e1e0214010c61377b6ae7a4c7253ce405e (HEAD -> master) rewrite readme txt
377b61e7b4c6c880acc365d9472d95e6e1225a0 wrote a readme file
你看到的一大串类似fd2f59e1…是commit id(版本号),是一个SHA1计算出来的一个非常大的数字,用16进制表示。HEAD表示当前的版本。
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交fd2f59e…(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。同时也可以用commit id.版本号没必要写全,前几位就可以了,Git会自动去找。 如果忘记commit id,可以使用要用git reflog查看命令历史,以便确定要回到未来的哪个版本。
- git reset --hard HEAD^
- git reset --hard fd2f59e(fd2f59e 是commit id的一部分)
工作区和暂存区
工作区就是我们电脑上可见的目录,如GitTest目录。工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支
撤销修改
- 丢弃工作区的修改,readme.txt文件在工作区的修改全部撤销:git checkout – readme.txt
这里有两种情况:
- 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
- 用命令git reset HEAD 可以把暂存区的修改撤销掉(unstage),重新放回工作区
删除文件
git rm readme.txt 相当于是删除工作目录中的readme.txt文件,并把此次删除操作提交到了暂存区。(新版本:git restore --staged ?)
git checkout – readme.txt相当于是让工作目录readme.txt恢复到暂存区中readme.txt的状态
远程操作
- 创建关联仓库:git remote add origin git@github.com:michaelliao/learngit.git
- git push 把本地库的所有内容上传远程代码并合并:git push -u origin master(-u:第一次推送不会产生新的master分支,并把本地的master分支和远程master分支关联,后面第二次使用应该去除)。
- git remote 远程仓库操作
- git fetch 从远程获取代码库
- git pull 下载远程代码并合并
- git remote rm origin 删除远程库,其实是解除本地和远程的绑定关系
- git clone git@github.com:michaelliao/gitskills.git 从远程克隆到本地
分支管理
使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
创建与合并分支
- 列出分支基本命令:git branch
- 创建分支命令:git branch (branchname)
- 切换分支命令:git checkout (branchname)或者git switch (branchname)
- 创建+切换分支:git checkout -b 或者git switch -c
- 合并分支命令:git merge (branchname)。(合并指定分支到当前分支)
- 删除分支:git branch -d (branchname)
解决冲突
当创建的新分支和后续master上继续改进后的版本有冲突
文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件,定位到冲突的地方后改好然后再提交,合并完成
- git log --graph命令可以看到分支合并图:git log --graph --pretty=oneline --abbrev-commit
分支管理
- git merge --no-ff -m “merge with no-ff” dev:合并dev分支,请注意–no-ff参数,表示禁用Fast forward。因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
- 如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。
bug修复
- 1、 git stash:把当前工作现场“储藏”起来,等以后恢复现场后继续工作
- 2、git checkout master
- 3、git checkout -b (bugname)创建bug分支,进行add和commit提交修复后版本
- 4、git switch master:切换到master分支
- 5、git merge --no-ff -m “merged bug fix” (bugname)
- 6、git switch (branchname):此时工作区是干净的
- 7、git stash list:命令查看
- 8、两种方案恢复工作区:①git stash apply恢复但不删除,git stash drop来删除。②git stash pop恢复的同时把stash内容也删了:
多人协作
- 首先,可以试图用git push origin 推送自己的修改;
- 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
- 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
- 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/。
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
重整分支
- git rebase:rebase操作可以把本地未push的分叉提交历史整理成直线
标签管理
- git tag :给当前分支打一个新标签。
- git tag :对add merge这次提交打标签
- git tag: 查看所有标签
- git show : 查看指定标签信息。还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
- $ git tag -a v0.1 -m “version 0.1 released” 1094adb
- 命令git push origin 可以推送一个本地标签;
- 命令git push origin --tags可以推送全部未推送过的本地标签;
- 命令git tag -d 可以删除一个本地标签;
- 命令git push origin :refs/tags/可以删除一个远程标签。
一些其他命令
- git status 查看工作区的状态
- git diff HEAD – readme.txt 查看工作区和版本库里面最新版本的区别
参考链接
https://www.liaoxuefeng.com/wiki/896043488029600
https://www.runoob.com/git/git-basic-operations.html
https://devpress.csdn.net/cloud-native/64fab29787b26b6585a1f402.html?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6Mjg4OTIzOSwiZXhwIjoxNjk4Mzc0OTk0LCJpYXQiOjE2OTc3NzAxOTQsInVzZXJuYW1lIjoicXFfNDA5MTAxOTEifQ.vj-_dLU_8nCQNSEDYS2owL3jR0MwPSz1tzDgW5trnJE