git操作

GIt基础

创建版本库
  • 通过git init命令把一个目录变成Git可以管理的仓库
1
git init  执行完后当前目录下会多一个.git的文件夹,默认情况下该文件夹是隐藏的,可以选择查看隐藏文件来显示
把文件添加到版本库
1
git add <filename>
把添加的文件提交到仓库
1
git commit -m "本次提交说明"

GIt版本控制

查看仓库当前状态
1
git status
查看某个文件的改动
1
2
3
4
5
6
7
8
9
10
git diff <filename>

$ git diff demo.txt
diff --git a/demo.txt b/demo.txt
index 66b666f..e10e664 100644
--- a/demo.txt
+++ b/demo.txt
@@ -1 +1,2 @@
Creating a new branch is quick ccccc.
+ssssssssssssssssssssss.
查看提交日志
  • git log命令显示从最近到最远的提交日志 , 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:
1
git log --pretty=oneline
版本回退
  • 首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本 上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
1
git reset --hard HEAD^  回退到上一个版本
  • 现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?
  • git提供了一个命令git reflog用来记录你的每一次命令,找到对应的commit id即可
1
git reflog
放弃修改
  • 当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
  • 当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD,就回到了场景1,第二步按场景1操作。

远程仓库

本地库关联远程库
1
2
3
$ git remote add origin git@github.com:自己的Github用户名/远程仓库名.git
eg: 我要关联我的远程仓库learngit
$ git remote add origin git@github.com:Commandercc/learngit.git
把本地库内容推到远程库
1
2
3
git push -u origin master

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

从现在起,只要本地作了提交,就可以通过命令:

1
git push origin master
克隆远程库
1
2
3
git clone <远程仓库地址>
eg:
git clone https://github.com/Commandercc/gitskills.git

分支管理

创建与合并分支
查看分支
1
git branch
创建分支
1
2
3
创建分支用 git branch <name> 
2.23版本之前创建并切换到新的分支 git checkout -b <name> ==> 相当于 git branch dev + git checkout dev 两条命令(先创建再跳转)
2.23版本之后创建并切换到新的分支可以用 git switch -c <name>
切换分支
1
2
git checkout <name> 或 git switch <name>
2.23版本后更推荐新的 switch 命令
合并某个分支到当前分支
1
git merge <name>
删除某个分支
1
git branch -d <name>
查看分支合并图
1
2
3
git log --graph (详细)

git log --graph --pretty=oneline --abbrev-commit
现场保存
1
2
3
4
5
6
7
8
9
10
11
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;

查看保存的工作现场: git stash list
恢复工作现场:一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
$ git stash apply stash@{0}(apply 后加要恢复的编号)

在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
删除未合并的分支
1
git branch -D <name>  强行删除
多人协作
查看远程库的信息
  • 当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin
1
git remote 或者用 git remote -v 显示更详细的信息:
推送分支
  • 推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
1
git push origin master

如果要推送其他分支,比如dev,就改成

1
git push origin dev
抓取分支

当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支。不信可以用git branch命令看看:

1
2
$ git branch
* master

现在,你的小伙伴要在dev分支上开发,就必须创建远程origindev分支到本地,于是他用这个命令创建本地dev分支:

1
$ git checkout -b dev origin/dev

你的小伙伴已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件作了修改,并试图推送 ,推送失败,因为你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送:

指定本地dev分支与远程origin/dev分支的链接

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

标签管理

  • tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起
创建标签
1
git tag <name>
查看所有标签
1
git tag
  • 默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?方法是找到历史提交的commit id,然后打上就可以了:

    1
    $ git tag v0.9 f52c633
查看某个标签信息
1
git show <tagname>
创建带有说明的标签
1
2
3
用-a指定标签名,-m指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" 1094adb
用命令git show <tagname>可以看到说明文字
删除标签
1
git tag -d v1.0
推送标签
  • 因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。

    如果要推送某个标签到远程,使用命令git push origin

    1
    2
    3
    git push origin v1.0
    或一次性推送全部尚未推送到远程的本地标签
    git push origin --tags

    如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

    1
    2
    $ git tag -d v0.9
    Deleted tag 'v0.9' (was f52c633)

    然后,从远程删除。删除命令也是push,但是格式如下:

    1
    2
    3
    $ git push origin :refs/tags/v0.9
    To github.com:michaelliao/learngit.git
    - [deleted] v0.9
0%