工作区(workspace)=> 暂存区(index)=> 本地场库(local repository)=> 远程场库(remote repository)
git有好几个区,工作区(workspace)、暂存区(index)、本地仓库(local repository)、还有远程仓库(remote repository)。远程仓库为我们保存一份代码,如github,而工作区、暂存区和本地仓库都在本地,这也就是为什么我们在没有网络的环境下也能使用git提交(commit)代码,因为提交仅仅是提交到本地仓库中,待有网络之后在推送(push)到远程仓库。
1、初始化场库
git init
2、提交代码到暂存区
git add . // 提交所有修改的文件到暂存区
git add [filename] // 提交特定的文件到暂存区
3、撤销提交到暂存区的文件
git reset HEAD . // 撤销所有暂存区的文件
git reset HEAD -filename // 撤销某个暂存区的文件
4、提交commit
git commit -m "初始化" // 提交暂存区代码到本地场库
git commit -a -m "初始化" // 可以将没有在暂存区的文件提交到本地场库(这一个直接省略了add)
git commit -am "初始化" // 同上
5、撤销commit之后的(撤销本地代码到)
git reset --soft HEAD^ // 撤销commit之后的代码=》撤销到暂存区
git reset --hard HEAD^ // 直接撤销到本地时候
git reset --hard 59cf878 // 撤销到某一个commit
6、修改commit信息
git commit --amend
7、用暂存区指定的文件替换到工作区
git checkout -- <file>
8、提交到远程
git push
9、临时保存文件
git stash // 保存临时修改的文件(保存至堆栈中,用于后续恢复当前工作目录)
git stash pop // 将当前stash中的内容弹出,并应用到当前分支对应的工作目录上。堆栈中的内容会删除。
10、新建分支
git branch [branch-name] // 新建一个分支,但依然停留在当前分支(远程没有也没有关系)
git checkout -b [branch] // 新建一个分支,并切换到该分支
11、切换分支
git checkout [branch-name] // 切换分支(该分支在本地已有)
11.1、新建并切换到新建的分支
git checkout -b [branch-name] // 新建并切换分支
12、合并分支
git merge [branch] // 合并指定分支到当前分支
git merge --abort // 取消合并
13、拉取
git fetch origin develop:develop // 拉取远程已有的分支,并在本地新建一个这样的分支
git pull origin develop // 拉取远程分支的代码
14、提交远程
git push origin develop
git pull和git fetch的区别
git fetch:相当于从远程获取最新版本到本地,不会自动merge
git pull:相当于从远程获取最新版本并merge到本地
git pull origin master
==》
git fetch 和 git merge
在实际使用中,git fetch更安全一些
因为在merge前,我们可以查看更新情况,然后再决定是否合并。
15、远程打tag
git tag -a v1.4 // 打一个tag
git tag -a v1.4 -m "my version 1.4" // 打一个tag并添加说明
git push origin v1.4 // 将这个tag提交到远程
16、查看日志
git reflog 和 git log的区别
git log 命令可以显示所有提交过的版本信息
git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
17、git diff
比较两个文件的不同
18、git cherry-pick
代码回滚
git reset --soft
只是改变了HEAD的指向,本地代码不会变化,我们使用git status依然可以看到,同时也可以git commit提交
git reset --hard
直接回改变本地源码,不仅仅指向变化了,代码也回到了那个版本时的代码,所以使用是一定要小心
git reset --hard HEAD^
git commit -m "iii" --no-verify // 跳过校验
代码回滚(Revert之后)重新修改之后,再rebase master 会覆盖原来的