Git 操作手册(简易)

Git Backup

这是我的Git备份操作手册,没有高深的东西,只是为了我自己方便使用。

以下内容参考自廖雪峰Git教程

不打算继续写了,看到变基那里,我大概就是把他的文章精简了一下,而且很部分操作我并没有去实现,怎么说呢,我感觉现在学习用不太到呀,我虽然很喜欢Git,但是实在没地方用啊...

版本更改

回到过去

首先可以使用git log查看当前版本信息,如果想要回退到上一个版本:

git reset --hard HEAD^

如果想要回到前5个版本:

git reset --hard HEAD^^^^^
git reset --hard HEAD~5

回到未来

如果我们知道版本的commit id,可以直接回到任意版本,所以你先回到上个版本,然后还是可以回到下个版本的。当然前提是你一定要记得那个版本提交的信息。

commit ee4122bb634142123cd4c3611b1373c499315199 (HEAD -> master)
commit b6ccd3619ff5af0773d93ce06e433859fab8fd84
commit 2b5ed9941c34972f4bbc4f2ca1d6dbe19a769212

回到b6ccd也就是上个版本

git reset --hard b6ccd
commit b6ccd3619ff5af0773d93ce06e433859fab8fd84 (HEAD -> master)
commit 2b5ed9941c34972f4bbc4f2ca1d6dbe19a769212

回到ee4122也就是下个版本

git reset --hard ee4122

如果你不记得commit id了,可以使用:

git reflog

查看修改

这个还是挺方便的

如果你修改了一个文件,但是没有add,这样是比较工作区的文件和版本库中的文件。

git diff file

如果你修改了一个文件,而且已经提交到暂存区中了,那么你使用git diff就是比较工作区和暂存区的文件了,所以这个时候如果你没有二次修改工作区的文件内容,那么是无差别的,当然也还是可以比较工作区和版本库中的文件。

git diff HEAD file

撤销修改

工作区

默认情况下,首先会撤销和暂存区文件不一样的内容,如果暂存区没有该内容,则是从HEAD所指向的版本库中文件对比撤销修改的内容。

git checkout file

暂存区

首先撤销提交到暂存区的文件,如果是第一次修改之后提交到了暂存区,然后又有第二次修改,那么可以直接撤销修改,这样是将第二次修改的内容撤销了。

git resotre --staged file
git checkout file

下面这种方法是清空暂存区的内容,然后对比版本库撤销修改

git reset HEAD file
git checkout file

版本库

既然已经在新版本了,我们就只能够版本回退

删除文件

删除也是修改

touch file
git add file
git commit -m "add file"

假如我们从工作区删除了该文件

rm -rf file

此时版本库中有这个文件,但是工作区没有了,那么我们有两个选择

在版本库中删除

这种办法相当于建立了一个新版本

git rm file
git commit -m "delete file"

此时工作区没有file,我们提交到暂存区的是一个空文件,然后提交到新版本,这和上面是一致的。

git add file
git commit -m "delete file"

撤销工作区的删除

在暂存区没有文件的情况下,用撤销修改实际上就是将工作区中的文件替换为版本库中的文件

git checkout file

远程仓库

这里就以全球最大的代码托管网站git为例子了

推送

首先我们要在github创建一个repository,然后在本地使用:

这里是将远程库origin关联到本地

git remote add origin https://github.com/imtin/test.git

将本地库推送到远程库:

将本地库的内容推送到originmaster 分支,第一次推送添加了-u参数,这是将远程库的master分支和本地的master分支关联起来,以后推送就可以不加了,甚至可以直接git push

git push -u origin master

克隆

上面是将本地库推送到远程,这里就是从远程拉取。主要有两种方式:

SSH

首先要创建一个SSH KEY

ssh-keygen -t rsa -C "youremail@example.com"

然后将~/.ssh/id_rsa.pub的内容添加到GithubSSH Keys

git clone git@github.com:imtin/test.git

Https

git clone https://git.suckless.org/dwm

这个不确定到底是不是Https

git clone git://git.suckless.org/dwm

管理

  1. 查看远程库的信息

    git remote show
    
    git remote -v
    
  2. 推送分支

    git push origin master
    

    如果远程库分支不存在,将在远程库创建新分支

    git push origin dev
    
  3. 拉取分支

    git switch -c dev origin/dev
    
  4. 提交冲突

    git branch --set-upstream-to=origin/dev dev
    
    git pull
    

分支管理

创建与合并分支

使用下面的命令可以创建一个dev分支并且切换过去,这个新分支拥有之前的所有内容。

git checkout -b dev
git switch -c dev

相当与:

git branch dev
git checkout dev

然后我们可以在这个dev分支上添加一些东西。

touche file
git add file
git commit -m "add file"

切换分支,可以发现。使用checkout不仅能够撤销修改,还能切换分支...有点离谱

git checkout master
git switch master

合并分支

git merge dev

删除dev分支

git branch -d dev

强行删除分支

一般来说,我们会先合并分支再删除,但是有时候突发情况并不需要合并了,如果同上面一样删除的话是不被Git允许的。

git branch -D <name>

查看分支

git branch

合并分支的冲突

首先新建一个分支dev,然后在这个分支里面修改提交内容,然后切换回master分支,这时候git会提示你分支比你的master领先一次提交。

然后我们在主分支中修改同样的文件,写入和dev分支不同的内容,然后提交,然后尝试合并:

git merge dev
Automatic merge failed; fix conflicts and then commit the result.

接下来就要手动修改冲突的文件了,这个的话,随便吧...这个我并没有弄很清楚

可以查看一下合并的记录:

git log --graph --pretty=oneline --abbrev-commit

Bug分支

照常有两个分支masterdev,现在我们在master上面发现了一个bug,假设dev上还没有解决这个Bug并且正在开发新功能,这时候我们需要切换一个新分支解决bug,而我们程序员只有一个人并且现在就在dev分支,那么应该怎么办呢?

  1. 保存快照

    为什么要保存快照?

    因为在不同分支,暂存区和工作区文件是共享的,我们在开发的分支还没有提交这些新代码,所以要将当前状态保存起来。注意我们需要先把更改提交到暂存区然后再保存,在工作区的修改是没办法只保存状态到当前分支的。

    git add .
    git stash
    
  2. 切换到master,创建issue分支

    git switch master
    git switch -c issue-01
    
  3. 解决bug

    git add patch.file
    git commit -m "fix bug 01"
    
  4. 回到master合并issue的提交

    git switch master
    git merge --no-ff -m "merged bug fix 01" issue-01
    
  5. 切换到dev分支,恢复快照

    git switch dev
    

    查看所有快照

    git stash list
    

    恢复快照并删除,默认情况下是恢复最近的快照,可选择。

    git stash apply <stash@\{n\}>
    git stash drop
    
    git stash pop <stash@\{n\}>
    
  6. 合并bug修复后的提交到dev

    注意此处,可以选择在issue-01分支上提交的commit-id,当然也可以选择合并master的提交记录,这是一样的。这个操作会在当前分支上创建一个提交,所以在工作区和暂存区不能有未提交的代码。

    git cherry-pick 'commit-id'
    
  7. 继续开发新功能

    do something
    

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://blog.imoyb.com/archives/simple-use-git