Git 快速入门
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git 快速入门相关的知识,希望对你有一定的参考价值。
Git 基本操作
讲师的博客:https://www.cnblogs.com/alex3714/articles/5930846.html
基本操作看之前自学的时候记的笔记:http://blog.51cto.com/steed/2138687
Git的官方文档(有中文):https://git-scm.com/book/zh/v2
回滚到上一个版本
用下面的命令,可以方便的回滚到前一次的提交:
$ git reset --hard HEAD^
HEAD is now at 2db6c31 首次提交,开始叫Git
HEAD就是当前版本的位置,加上一个尖号(‘^’)就是向前一个版本。如果是向前2个版本就是2个尖号。
查看信息
回滚之后再查看log的话,只会有当前版本之前的log。这时可以用git reflog命令:
$ git log
commit 2db6c315f98fd11ef43d5114a071dca88dda238d (HEAD -> master)
Author: 骑士救兵 <[email protected]>
Date: Thu Sep 20 15:01:45 2018 +0800
首次提交,开始叫Git
$ git reflog
2db6c31 (HEAD -> master) [email protected]{0}: reset: moving to HEAD^
90a5288 [email protected]{1}: commit: 第二次提交,增加了哪几期参加了git这节课
2db6c31 (HEAD -> master) [email protected]{2}: commit (initial): 首次提交,开始叫Git
回滚到指定版本
这里不用checkout,继续用上面的reset。这次把最后的HEAD^参数替换成对应的版本的md5值,只要reflog里显示的前几位就好了:
$ git reset --hard 90a5288
HEAD is now at 90a5288 第二次提交,增加了哪几期参加了git这节课
撤销修改
修改过文件后,要先add,然后commit就提交到本地仓库了。在commit之前是可以撤销之前的修改的(不留痕迹)。如果commit过了,就会在仓库中留下痕迹了,就无法真正的撤销了。
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: "350257276347250213346227245346234237.txt"
在add之后,使用git status,根据提示的命令操作,git reset HEAD <file>
:
$ git reset HEAD 课程日期.txt
Unstaged changes after reset:
M 课程日期.txt
然后再用git status确认状态:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: "350257276347250213346227245346234237.txt"
no changes added to commit (use "git add" and/or "git commit -a")
上面的操作就是add的反向操作,把文件从索引拿回工作区。但是文件的内容还是之前修改后的内容,此时当然可以手动到文件里去做修改,不过根据提示使用 git checkout -- <file>
,就可以撤销文件里修改内容:
$ git checkout -- 课程日期.txt
这里成功没有任何提示信息。
现在就把之前的修改完全撤销了,并且不留痕迹。
删除文件
从版本中删除一个文件,要如何add呢。可以把文件删掉,然后用提交所有的方法:
$ git add .
如果要指定文件名,就不能用add了,可以用rm:
$ git rm test.txt
rm ‘test.txt‘
命令执行后,也会同事把文件从系统中删除。
之后还是执行一次 git commit 提交当前的版本。
远程仓库
首先登录你的远程仓库,Github或者Gitee,创建一个项目。
创建项目
创建项目要填好项目名称,然后第一次用,一定要把README的那个选项去掉,否则提交之后不会出现提交远程仓库的帮助信息:
连接远程仓库
根据提示,先用 git remote 连接到远程仓库:
$ git remote add origin https://gitee.com/<用户名>/GitPro.git
成功的话没有提示信息,告诉你的本地仓库,给远程仓库提交的时候就往这个地址提交。
这时可以用git remote 查看已经添加的远程仓库信息,-v可以看详细:
$ git remote
origin
$ git remote -v
origin https://gitee.com/XXXXXX/GitPro.git (fetch)
origin https://gitee.com/XXXXXX/GitPro.git (push)
提交代码
向远程仓库提交代码就用这句命令:git push origin master
现在可以提交代码到远程仓库了:
$ git push -u origin master
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (10/10), 1.57 KiB | 267.00 KiB/s, done.
Total 10 (delta 2), reused 0 (delta 0)
remote: Powered by Gitee.com
To https://gitee.com/XXXXXX/GitPro.git
* [new branch] master -> master
Branch ‘master‘ set up to track remote branch ‘master‘ from ‘origin‘.
从现有仓库克隆
如果本地还没有仓库,那么就要先去远程仓库克隆一份到本地。克隆拉取到的是整个项目完整的所有历史数据:
$ git clone git://github.com/schacon/grit.git
默认就是在本地创建项目名称的同名文件夹了,也可以自定义项目名称,把名称放在命令后面再多一个参数:
$ git clone git://github.com/schacon/grit.git mygrit
拉取远程仓库的代码
下载代码,是下载当前分支的代码。所以如果有多个分支,先确认切换到了你要的分支:
$ git pull
命令很简单,什么参数也没有,就是把你当前的分支的远程仓库的代码拉下来。
分支管理
略了,上次记录的笔记里有。
查看分支合并情况
还用用查看提交历史的命令 git log
,加上--graph 选项,可以形象地展示了每个提交所在的分支及其分化衍合情况:
$ git log --graph
上面的命令的结果会很长,结果就不贴出来了。还可以加参数来优化,看起来更加清晰,就是每个版本的详细信息少了。
$ git log --graph --pretty=oneline
* 8ea95936cfe5c50c6113a56b31f73bb251b17105 (HEAD -> master) Merge branch ‘alpha‘
|| * fc9e77cd8b2cc2c5426c646d35d3609dc1c48675 (alpha) alpha 分支第一次提交
* | 8f25b065e21b85502f1b3a28dacd526b5d1b55ae alpha分支建立之后,切到主分支创建了mast_alpha文件
|/
* 0166a4b396b0874555cd8a9ff40ef58f9120d281 之前提交的版本貌似文件没有内容
* 959b03d0b8da43f7052fc3fd26172467067eef37 新加一个gitee.txt文件
* 929eeaab31f374acda4e346b229bf801c76f6a98 删除test.txt文件
* bfcaf896defd978b3a6d119c31cb48abaa70aefe 先提交一个test.txt,测试删除文件
* 90a52887600925e02577306510d8b7c22b1af01d 第二次提交,增加了哪几期参加了git这节课
* 2db6c315f98fd11ef43d5114a071dca88dda238d 首次提交,开始叫Git
这个命令貌似更常用,内容也更加精简:
$ git log --graph --oneline
* 8ea9593 (HEAD -> master) Merge branch ‘alpha‘
|| * fc9e77c (alpha) alpha 分支第一次提交
* | 8f25b06 alpha分支建立之后,切到主分支创建了mast_alpha文件
|/
* 0166a4b 之前提交的版本貌似文件没有内容
* 959b03d 新加一个gitee.txt文件
* 929eeaa 删除test.txt文件
* bfcaf89 先提交一个test.txt,测试删除文件
* 90a5288 第二次提交,增加了哪几期参加了git这节课
* 2db6c31 首次提交,开始叫Git
上面的参数 --oneline,实际上是这两个参数的简化用法 --pretty=oneline --abbrev-commit 。
储藏(git stash)
当你的代码写到一半的时候,此时来了一个Bug,需要你立刻处理。处理Bug的话,你需要新开一个Bug分支,先在这个分支上修改代码。但是此时,你不能直接切换分支,否则会把你未完成的代码带到新开的Bug分支里去。一个做法是,先提交到一个新的分支,然后回到之前的主分支上,然后再开Bug分支。不过你可能甚至不想提交你尚未完成的代码,此时可以用 git statsh ,先存储你的修改。
暂存修改
我此时正在开发一个beta版,已经做了一些修改:
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
beta.txt
nothing added to commit but untracked files present (use "git add" to track)
上面查看状态,工作区有新的未提交的内容。此时Bug来了,我要新开一个Bug分支,但是在那之前,得先有一个干净的工作区。这里用git stash来存储:
$ git stash
No local changes to save
这里显示并没有任何变化要存储,所以并没有把工作区的修改存储起来。用git status查看,工作区仍然有之前未完成的修改内容。这里需要先 git add 添加到索引区,然后再存储:
$ git add .
$ git stash
Saved working directory and index state WIP on master: 8ea9593 Merge branch ‘alpha‘
完整的命令应该是 git stash save
,这里save可以省掉。
此时再检查状态,工作区已经干净了:
$ git status
On branch master
nothing to commit, working tree clean
去看看文件内容,之前修改到一半的内容也都没了。不过之后还能再拿回来
假装做了Bug修复
现在有一个干净的工作区了,可以开一个处理故障的新分支了:
$ git checkout -b bug-101
Switched to a new branch ‘bug-101‘
然后随便做些修改,假设就修复了Bug:
$ git add .
$ git commit -m "hotfix-101"
[bug-101 6fb73d5] hotfix-101
1 file changed, 2 insertions(+), 1 deletion(-)
上面修复之后,已经没问题了,就和master分支进行合并:
$ git checkout master
Switched to branch ‘master‘
$ git merge bug-101
Updating 8ea9593..6fb73d5
Fast-forward
alpha.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
$ git branch -d bug-101
Deleted branch bug-101 (was 6fb73d5).
$ git branch
alpha
* master
合并之后,顺手把那个bug分支也删掉了。
继续之前的工作
Bug处理完了,现在可以继续之前的做了一半的工作了,先看一下之前暂存的信息:
$ git stash list
[email protected]{0}: WIP on master: 8ea9593 Merge branch ‘alpha‘
取回暂存的内容:
$ git stash apply
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: beta.txt
清理暂存的数据
虽然已经那会了之前修改了一半的内容,但是你这个暂存的版本在git里还是保留着的。可以再用 git stash list 查看确认。此时可以用下面的命令进行清理:
$ git stash drop
Dropped refs/[email protected]{0} (0b8311f47144c409729e197578afab0e43153b1f)
再次都要一步删除的操作也很麻烦,可以用pop,在恢复的同时删除:
$ git stash pop
多次stash
如果进行过多次的stash,那么就会有多个版本。上面的命令应该是默认恢复到最近的,当然可以指定恢复到某一个。先用list查看所有暂存的版本,然后指定恢复到其中的一个:
$ git stash list
[email protected]{0}: WIP on master: 8ea9593 Merge branch ‘alpha‘
[email protected]{1}: WIP on master: 8ea9593 Merge branch ‘alpha‘
[email protected]{2}: WIP on master: 8ea9593 Merge branch ‘alpha‘
$ git stash apply [email protected]{1}
忽略特殊文件
有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们。这时候可以配置一个特殊的.gitignore文件。
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件
- 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件
依然很烦,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。
这里是python的:https://github.com/github/gitignore/blob/master/Python.gitignore
最后把.gitignore文件也提交到Git就可以了,位置就放在你项目的更目录下面。既然你的.gitignore文件也在git里面,自然也能给这个文件做版本管理。
全局的忽略文件
另外还可以写一个全局忽略的文件列表,然后把你文件的路径写到你全局的配置文件里:
git config --global core.excludesfile ~/.gitignore
你可以用下面的命令,查看你全局的配置文件的内容:
$ git config --global core.excludesfile
~/.gitignore
顺便你还可以用这些命令,查看你的各种配置:
$ git config --system --list
$ git config --global --list
$ git config --local --list
$ git config --list
强制添加
如果文件被忽略了,在用 git status 查看状态的时候,就不会看到这个文件了。但是如果这个文件又需要被提交,但是不想去修改配置,可以用下面的命令,强制添加原本被忽略的文件:
$ git status
On branch master
nothing to commit, working tree clean
$ git add -f .idea
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: ignor.txt
因为我做了配置,忽略ignor.*的文件,所以该文件在检查状态的时候被忽略了。然后将这个文件进行强制添加,这里如果不带-f参数,只是指定文件名的话,是会提示错误,提示你加上-f参数。加上-f参数就可以完成add,然后commit和之前是一样的。
检查忽略规则
检查在你的规则中,具体是哪一条把文件忽略了:
$ git check-ignore -v ignor.txt
.gitignore:4:ignor.* ignor.txt
这个方法可以帮你找出来,自己的规则哪里写错了。
Pull Request
这个主要是在给别人的项目贡献代码的时候要用到的,大概也没啥机会会用到,随便记下步骤好了。
首先要fork这个项目,这是在你没有项目的push权限的情况下,贡献代码的另外一种方式。请求仓库拥有者拉自己的代码,所以不需要有仓库的权限。
fork之后,就可以在自己的账号下看到这个项目了。一定要从自己的账号下clone仓库,因为你改了之后无法提交到别人的项目里去(没有push权限)。
修改之后,就是给仓库的拥有者发pull request,最后由对方决定是不是要用你的代码。
小结,大致就是下面的步骤:
- 在GitHub上,可以任意Fork开源仓库
- 自己拥有Fork后的仓库的读写权限
- 可以推送pull request给官方仓库来贡献代码。
以上是关于Git 快速入门的主要内容,如果未能解决你的问题,请参考以下文章