[ Git ] 工作原理与常用命令大全
原文地址:
https://blog.****.net/web_****_share/article/details/79243308
原理图
Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库
工作区间: 即我们创建的工程文件, 在编辑器可直观显示;
缓存区: 只能通过git GUI或git shell 窗口显示,提交代码、解决冲突的中转站;
本地仓库: 只能在git shell 窗口显示,连接本地代码跟远程代码的枢纽,不能联网时本地代码可先提交至该处;
远程仓库: 即保存我们代码的服务器,本文以公共版本控制系统:github为例,登录github账号后可直观显示;
接下来, 我们以三个实际操作的例子讲解git的日常,代码如何在上述4个区域流动。
一个正常的代码推送流程:
指令解释:
git init
表示在当前的项目目录中生成本地的git管理;
git add README.md
将“README.md”文件保存至缓存区,实际开发中一般使用 git add -A
,使用-A:将新增、删除、修改的文件改动全保存至缓存区;
git commit -m "first commit"
将代码从缓存区保存至本地仓库,实际开发中一般使用git commit -am "说明的文字"
,使用 -a:如果没文件更改操作(增、删、改名)就可以省略git add指令;
git remote add origin https://github.com/wteam-xq/testGit.git
将本地仓库与指定的远程仓库创建 联系;
push -u origin master
将本地仓库代码推送至远程仓库,实际开发中 该指令后需要输入github 账号以及密码。(首次提交注意别遗漏-u
指定默认主机)
以上指令正常执行后, 本地仓库的代码就提交到远程仓库了:
分支
作用 | 命令 |
---|---|
列出所有本地分支 | $ git branch |
列出所有远程分支 | $ git branch -r |
列出所有本地分支和远程分支 | $ git branch -a |
新建一个分支,但依然停留在当前分支 | $ git branch [branch-name] |
新建一个分支,并切换到该分支 | $ git checkout -b [branch] |
新建一个分支,指向指定commit | $ git branch [branch] [commit] |
新建一个分支,与指定的远程分支建立追踪关系 | $ git branch --track [branch] [remote-branch] |
切换到指定分支,并更新工作区 | $ git checkout [branch-name] |
切换到上一个分支 | $ git checkout - |
建立追踪关系,在现有分支与指定的远程分支之间 | $ git branch --set-upstream [branch] [remote-branch] |
合并指定分支到当前分支 | $ git merge [branch] |
选择一个commit,合并进当前分支 | $ git cherry-pick [commit] |
删除分支 | $ git branch -d [branch-name] |
删除远程分支 | $ git push origin --delete [branch-name] |
删除远程分支 | $ git branch -dr [remote/branch] |
注:合并分支的一个常用操作: git merge --no-ff release-1.2 其中 --no-ff
参数在原文链接中有详细解释,以及合并分支的具体场景
添加删除
作用 | 命令 |
---|---|
添加指定文件到暂存区 | $ git add [file1] [file2] … |
添加指定目录到暂存区,包括子目录 | $ git add [dir] |
添加当前目录的所有文件到暂存区 | $ git add . |
添加每个变化前,都会要求确认 对于同一个文件的多处变化,可以实现分次提交 |
$ git add -p |
删除工作区文件,并且将这次删除放入暂存区 | $ git rm [file1] [file2] … |
停止追踪指定文件,但该文件会保留在工作区 | $ git rm --cached [file] |
改名文件,并且将这个改名放入暂存区 | $ git mv [file-original] [file-renamed] |
(日常使用中会用git status
看看是否有文件需要git add
):
提交
提交是只将代码提交到本地代码仓库区。
作用 | 命令 |
---|---|
提交暂存区到仓库区 | $ git commit -m [message] |
提交暂存区的指定文件到仓库区 | $ git commit [file1] [file2] … -m [message] |
提交工作区自上次commit之后的变化,直接到仓库区 | $ git commit -a |
提交时显示所有diff信息 | $ git commit -v |
使用一次新的commit,替代上一次提交。 如果代码没有任何新变化,则用来改写上一次commit的提交信息 |
$ git commit --amend -m [message] |
重做上一次commit,并包括指定文件的新变化 | $ git commit --amend [file1] [file2] … |
git -commit -m 与git commit -am的区别
注意:git -commit -m 与git commit -am的区别。 在此之前,你要理解,什么是文件的跟踪状态。
- 在项目文件夹中新增一个文件如’a.txt’时,该文件处于未跟踪状态(untracked)。未跟踪状态的文件是无法提交的
- 使用git add a.txt,使其变成已跟踪状态(tracked)
- 使用git commit -m 'add a.txt’就可以顺利提交了
- 由此可见git add filename 会将未跟踪文件设置为开始跟踪。但是git add filename会根据文件的不同状态,做不同的处理。如果 a.txt 已经被设置跟踪了,但是经过了一些修改,这些修改时不能直接commit的,因为它们没有暂存,必须再次调用git add a.txt 将已跟踪文件添加到暂存,才能commit。
- 而 git commit -am正是帮我们默认自动的a做了dd了这一步。
总结
这两个命令的区别的关键就是git add命令
git add命令是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等
我们需要用git add命令来跟踪新文件,但如果使用git commit -am可以省略使用git add命令将已跟踪文件放到暂存区的功能
git add 在解决冲突时使用
https://blog.****.net/yangstarss/article/details/80691775
解决冲突后提交本地修改的思路大概如下:
将本地修改的代码放在缓存区, 然后从远程仓库拉取最新代码,拉取成功后再从缓存区将修改的代码取出, 这样最新代码跟本地修改的代码就会混杂在一起, 手工解决冲突后, 提交解决冲突后的代码。
远程
作用 | 命令 |
---|---|
下载远程仓库的所有变动 | $ git fetch [remote] |
显示所有远程仓库 | $ git remote -v |
取回远程仓库的变化,并与本地分支合并 | $ git pull [remote] [branch] |
上传本地指定分支到远程仓库 | $ git push [remote] [branch] |
强行推送当前分支到远程仓库,即使有冲突 | $ git push [remote] --force |
推送所有分支到远程仓库 | $ git push [remote] --all |