目录
git 前提知识
首先要知道四个分区:
- 工作区 :代码在本地存储的目录位置(自己本地的代码)。
- 暂存区 :git 可以追踪的代码 — 临时存储
- 本地库 :暂存区的代码可以提交到本地库(commit),并生成对应的版本 ——生成历史版本
- 远程库:(远程库:如 github)本地区的代码可以提交到远程库(push),并生成对应的版本 ——存储在远端
git 常用操作
git init
初始化当前目录为仓库,初始化后会自动将当前仓库设置为 master。
git branch
使用 git checkout -b 参数来创建一个分支,创建完成分支后会自动切换过去:
git branch -b 分支名
使用 branch 来查看当前属于哪个分支,也就是查看 HEAD 的指向:
git branch
查看当前所有分支可以使用, HEAD 就指向当前分支:
git branch -a
删除分支:
git branch -D 分支名 // 删除本地分支
git push origin --delete 远程分支名
分支的重要性:
当我们在开发中,无论做什么操作都建议使用分支,因为在团队开发中,master 只有一个,合作开发里任何人都可以从 master 里拉取代码,拉取时 master 后创建分支,分支名改为你要做的操作,比如修改某某文件,修改什么什么 bug,单词以下划线做分割,然后在提交一个版本
分支名必须简洁,和标题一样,提交的 commit 在简单描述一下就可以了。
如我们的 master 中有个 bug,是内存泄漏
我们可以常见一个分支名为 Memory_Leak,然后在 commit 里简单描述一下修复了哪个模块的内存泄漏,不要写修复了什么什么代码,什么什么问题导致的,只需要简单描述一下就可以了。
一般情况下,我们都是拉取 master 后,想要修改功能或者添加功能,都是创建分支,在分支里修改不影响 master,如果修改错了代码或者误删之类的,在从 master 上拉取一份就可以了。
git checkout
切换分支:
git checkout 分支名 //切换到分支
git checkout -b 分支名 //等价于 git branch -b 分支名,就是创建分支,并切换到创建的新分支上
git status
查看当前仓库状态, 可以使用 git status 查看文件是否被改动,如果修改了就是这样:
如果是添加,Untracked 代表未提交:
使用 git add 命令后, 再次 status 就会变成绿色。
git add
将文件从工作区中,添加到暂存区。
git add --all // 将当前目录下包括子目录下所有改动的文件提交到暂存区,还会把删除的文件也提交进去
git add . // 与 git add --all 相差不大,但是不会记录删除操作。
git commit
提交到本地仓库,一般使用下面命令来简写描述我们的信息,如果不使用-m,会调用终端的注释编辑器让你输入描述信息。
git commit -m "你的备注"
git commit 会为我们生成 40 位的哈希值,用于作为 id,并把刚刚用 git add 添加到提交缓存区里的文件提交到本地仓库中,便于我们回滚。
至此,这个文件就已经添加到本地仓库中了,同时本地仓库也迭代了一个版本。
改写提交命令,我们提交了仓库,但是发现注释写错了,我们可以使用 --amend 长命令选项来改写提交:
git commit --amend
git log
查看历史提交日志,想要确定是否改写成功,我们可以使用 git log 查看一下。
具体例子:
git reflog
git reflog 可以查看当前版本库的提交历史,凡是对仓库版本进行迭代的都会出现在这个里面,包括你回滚版本都会出现在这个历史中。
git stash
在当前工作区修改了文件或者其它功能时,你想要切换或者创建到其它分区是不可能的,我们分支修改了内容,想要切换到其它分区 git 会终止你这样操作,为的是防止丢失当前工作区内容。我们可以使用 git stash 命令来保存当前工作状态:
git stash
git stash list //查看当前存储了多少工作状态
在别的分支做完事情之后,在切换回刚刚的分支,然后在刚刚的分支中将状态恢复:
git stash pop //pop 后,在 list 保存的列表会删除
准确来说,这个命令的作用就是为了解决 git 不提交代码不能切换分支的问题。
git cherry-pick
对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用合并( git merge )。另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 Cherry pick。
将一个分支上的某个 commit 合并到另一个分支,可用使用 cherry-pick 命令实现。
比如将 dev 分支上 commit_id 为 f99f2b57b 的提交合并到 master 分支:
1)切换到 master 分支:git checkout master
2)执行 cherry-pick 命令:git cherry-pick f99f2b57b
3)推送到远程 master 仓库:git push
注意 master 上新的 commit id 与 dev 上的 id 并不相同,即只是将 dev 上的修改拷贝过来作为一个新的提交,这就会带来一个问题:cherry-pick 之后,dev 想再次 merge 到 master,要先对 dev 分支进行 rebase 变基或拉取 master 分支最新代码。
举个更详细的例子,命令的作用就是把指定的 commit,拉到一个新的分支上。
这幅图中,每个圆圈代表一次 commit,一条线是一个分支, 比如 c2,c3,这是两次提交,在同一个分支上。
此时需求是:要把绿色分支的 C3,蓝色分支的 C5,紫色分支的 C7 合到一条新的分支上。此时就需要 cherry-pick 命令了。
首先切到 master 分支,然后输入以下命令后会得到下图效果:
git cherry-pick C3 C5 C7
git patch
本地修改未 commit
希望把修改的内容生成 patch,可以如下操作:
git diff > commit.patch
对于已经 add 但是未 commit 的修改:
git diff --cached > commit.patch
本地修改已 commit , 希望把最近一次的修改生成 patch:
git diff commit_id1 commit_id2 > test.patch #(commit_id1 是最后 1 次 id commit_id2 是倒数第二次提交的 id ,这里是举例打 1 次提交的 patch 当然也可以使用就一个 id 就是倒数第二次的 id,多个提交的话需要注意 id 即可,)
# 注意:commitId 为倒数第二个提交 ID
git diff commitId > commit.patch
apply 应用 patch
生成 patch 文件后,我们切换到希望应用 patch 的分支,然后按下面的步骤操作:
# 检查 patch 是否可以应用
git apply --check commit.patch
# 打单个补丁
git apply commit.patch
# 打多个补丁
git apply ../patch/*.patch
打完补丁后再 add/commit 进行提交。
git rebase
git rebase 是将提交到某一分支上的所有修改都移至另一分支上。即如果在 B 分支上使用 git rebase A 就是将 B 分支上的修改都变基(移到)A 分支上
git pull/merge/fetch
- git fetch 是将远程库的最新内容拉到本地库,用户在检查了以后决定是否合并到工作区中。
- git merge 是将本地的两个分支合并,如果在分支 A 中执行 git merge B,那就是将分支 B 中的代码合并到分支 A 中。
- git pull 则是将远程主机的最新内容拉去到本地库后直接合并到工作区中,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。
git 撤销模式
Git撤销修改_git 撤销本地修改_路痴的兔子的博客-CSDN博客
撤销修改分为以下情况:
1、已经 commit 提交到版本库。
已经使用 commit 提交到了版本库, 因为已经产生了新的提交,所以撤销修改可以使用 git reset --hard HEAD^来回退到上一个版本,从而达到撤销修改的效果。
git reset --hard HEAD^ //撤销之前的 commit,并且舍弃之前 commit 的修改
git reset --soft HEAD^ //撤销之前的 commit,并且保留之前的 commit 修改
2、已经 add 提交到暂存区,但是没有使用 commit 提交到版本库。
因为已经提交到暂存区了,所以撤销修改需要先将提交到暂存区的修改拿回到工作区。
git reset HEAD <file>
命令 git reset HEAD <file>可以把暂存区的修改撤销掉,重新放回工作区。==注意该命令和回退版本的命令的区别,因为很相似。==这样所有的修改就回到了工作区,丢弃工作区的修改只需执行以下命令。
3、 文件修改都在工作区,没有提交到暂存区。
丢弃工作区的修改只需要执行一下命令(不能丢弃新建的文件,也就是 untrack 文件):
git checkout -- <filename> //使用 git restore <file> 的效果一样
git checkout . // 丢弃所有文件修改
4、文件修改在工作区,且是新建的文件(untrack 文件)
两种办法,要么是自己手动删除这个文件,要么输入:
git clean -n //是一次 clean 的演习, 告诉你哪些文件会被删除。记住他不会真正的删除文件, 只是一个提醒。
git clean -f //删除当前目录下所有没有 track 过的文件。他不会删除.gitignore 文件里面指定的文件。
git clean -f fileFullName //删除指定路径下的没有被 track 过的文件。
git clean -df //删除当前目录下没有被 track 过的文件和文件夹。
git clean -xf //删除当前目录下所有没有 track 过的文件。不管他是否是.gitignore 文件里面指定的文件夹和文件。