首先我们要知道github是干什么的,github是一个版本控制工具,可以记录你每次提交的code的变化的情况,嗯,大概就是这样。
- git init 新建一个空的仓库
- git status 查看仓库的状态
- git add + file 向仓库中添加文件
- git commit -m '说明' 先仓库中添加文件后的备注说明,养成写commit的习惯非常有帮助,因为当你修改的次数多了之后,你不一定能记住哦~
- git push -u origin master 将本地的仓库推送到远程的仓库
- git log 查看变更日志
- git reset -hard 版本号前六位 回归指定的版本
- git branch 查看分支
- git branch newname 创建一个名叫newname的分支
- git checkout branch_name 切换到名叫branch_namde的分支上
- git merge branch_name 将名叫branch_namde的分支合并到当前的分支上
- git pull origin master 将master分支的内容拉到本地
- git diff file_name 可以查看文件的变化
-
当我们想回退到某个版本的时候,应该怎么操作,在Git中,head表示当i当前的版本,或者回到以前的版本又想回到现在的版本怎么办
-
首先我们可以使用
git log
命令查看变更日志,执行该条命令之后我们可以看到整个仓库的变更的历史,同时我们可以看到一个commit id(版本号)
这个是你每次提交系统自动生成的,同时还可以看到你每次修改增加的备注,通过这些备注的说明你就可以决定自己要退回到哪个版本了,是不是有点像操作系统实验时有的同学用到的快照 \斜眼笑,同时我们还应该知道在Git中,HEAD
表示当前版本,上一个版本是HEAD^
,上上一个版本是HEAD^^
,所以易得上一百个版本是HEAD
+100个^
,当然没这么蠢,可以写成HEAD~100
以下是我执行gitlog之后的截图: -
git reset --hard commit_id的前六位
可以回退到指定的版本,注意那个--hard
参数的意义,通过查阅网上的资料可以看出,这里可选的参数一共有三个,分别是hard,soft,mixed
,分别代表不同的意义-
hard 将最近一次提交节点的提交记录全部清除
-
soft 将最近一次提交节点的提交记录回退到暂存区
-
mixed 将最近一次提交节点的提交记录回退到工作区 下面放一张关于github三个分区的说明图
这个要好好理解一下,就可以很好的理解git中大多数命令的含义,这里再贴一个链接 关于git中区的介绍
-
-
如果回到以前的版本之后还想回到原来的版本怎么办呢,有下面两种情况
- 如果你现在的命令窗口还没关的话,你可以直接
git reset --hard commit_id前六位
,意思就是如果你能直接在当前的命令行窗口里面找到你要回退的版本的commit_id
的话就可以直接回退回去了 - 当然如果你找不到的话,可以使用
git reflog
查看你的变更记录,在这个log里面你可以找到你的回退记录。同样使用如上命令进行回退。 反正核心就是知道commit_id
就可以回退到相应的版本
- 如果你现在的命令窗口还没关的话,你可以直接
-
我看网上教程还有一种使用
HEAD
的命令,但是自己试验并没有成功,这里还是介绍一下git reset --hard HEAD^
,这个HEAD^
就是上面介绍的含义。补充:在官方文档看到了关于HEAD
这个东西的一种使用方法,git reset HEAD <file_name>
,可以取消暂存,至于前面那个命令,俺也⑧知道咋回事
到这我们就学会了如何使用github来进程版本控制了,下面介绍一些新内容 再记录一下关于git中区的介绍:
git add
是将工作区的文件保存再暂存区git commit
是将暂存区中的文件放到版本库中,养成好好写commit的习惯,非常重要,同时commit才是提交到版本库的最终操作git push
可以将版本库中的文件存在远程服务仓库中git pull
可以从远程仓库中下载相应的文件git diff
可以查看工作区和暂存区文件的差异git status
可以查看工作区文件的情况git diff HEAD -- README.md
可以查看当前工作区与版本库中最新版本的区别
- 如果我们提交之后发现漏掉了几个文件没有添加,或者提交信息写错了,可以使用
git commit --amend
重新提交,如果是漏掉了文件,可以这样操作git commit -m 'initial commit' git add forgttoen_file git commit --amend
git chechout -- file_name
可以将工作区的文件撤回到最近一次git add
或者git commit
的状态,回顾一下前面的三大分区的内容,git add
表示的是暂存区的内容,git commit
表示版本库的内容。--
表示的是分支,这个之后再介绍。看到官方文档的一句话:你需要清楚的知道该命令是一个危险的命令,你对文件做的任何修改都会消失,你只是拷贝了一个文件来覆盖他,听说新版的已经将checkout替换为resotre
,git reset HEAD file_name
其作用是撤销暂存。如果在调用的时候加上--hard
将让git reset
成为一个危险的命令,可能导致当前工作目录所有当前进度丢失,不加选项的调git reset
并不危险,他只会修改暂存区域,不会修改工作区。emmm,如果这里不懂的的话,可以自己这样操作一下,先add一个文件,使用git status
查看当前仓库的状态。可以看到文件已经被暂存了,然后在使用这条命令,再执行git status
可以看到文件变为未暂存了。emmm,我试了一下,就是虽然取消了暂存,但是不会将工作区的内容撤回到上一次git add
的内容,只是将状态改变为unstage
- 一般我们删除文件都是直接在文件管理器中删除,这时使用
git status
,这是Git将会告诉你有文件被删除了,因为工作区与版本库不一致了,这时你有两种选择,一个是确实要从版本库中删除,这时可以使用git rm
删除这个文件,并且要commit
,如果这是误删,可以使用git checkout file_name
,从版本库中恢复。如果一个文件已经提交到版本库了,永远不担心误删,但是只能恢复到文件的最新版本,你会丢失最近一次提交后你修改的内容。,那么误删了之后怎么恢复呢。git checkout -- README.md
就ok了。听说在新版本的Git中git checkout
被git restore
替代了。 - 记住在Git中,你提交的所有东西几乎都是可以恢复的,但是未提交的就不一定能找回来了
- 补充:执行
git status
时,会顺带输出一些恢复操作的命令,eggit restore <file>
to discard changes in working directory.git restore --staged <file>
to unstaged - 这里分享一个看到的问题,就是先
git add
一个文件,修改之后再git add
,中间没有git commit
,然后再git commit
,此时版本库中是最近一次的文件。原因是git add
是将文件加入跟踪列表,而每一次跟踪是以commit为准的。
-
到目前为止,我们的代码都还是保存在本地的那么怎么推送给远程仓库呢,首先我们应该让github的服务器知道我是我,这就需要我们生成一个密钥了。使用如下命令
ssh-keygem -t rsa -C youremail@email.com
后面就是你注册github的邮箱,然后就可以一路回车了,然后你就可以在用户的目录下发现一个.ssh文件夹,里面有两个文件,一个是公共密钥,一个是私有密钥,公共密钥可以放心的告诉别人,但是应该保存好私有密钥。 -
生成好密钥之后,我们可以登录github网站,点击头像下方发Setting,找打ssh and GPGkeys,new sshkey,将生成的公共密钥粘贴到里面(随便起一个title,eg:家里电脑的ssh),以上我们便连接上了github的服务器。
-
然后在github上创建一个仓库(repository)。这里我将该仓库命名为learngit
-
使用
git remote add origin git@github.com:twn29004/git_name.git
解释一下这个命令,增加名叫origin
的远程仓库,同时与在github上创建的名为git_name
的仓库关联起来,其他的都是固定的貌似(暂时的理解是这样) -
git push -u origin master
将本地文件上传至远程仓库,由于第一次推送master
分支,加上-u
参数,Git不但会把本地的master
分支内容推送到远程仓库的新的master
分支,还会把本地的master
分支与远程的master
分支关联起来,以后的推送就可以只用git push origin master
-
将远程仓库克隆到本地。
git clone git@github.com:user_name/git_name.git
,也可以使用git提供的连接进行Clone.git clone url
,这里github提供了多种协议,git协议和https协议。如果想使用git协议可以在CloneorDownloag那点击use ssh连接就会变为git协议。听说git协议更快一点.补充(windos中查看文件目录下所有文件的名字的命令为dir ./b
),需要特别注意的是,这里的是用户名,不是你注册的邮箱,是你注册的用户名
下面是除了仓库外,github中的另一个东西------Branch(分支),分支的功能相当于一个岔路,嗯,可以这么说,举个例子,你现在已经有了一个完整的项目,项目是可以正常运作的。但是你现在想新添加一些功能。但是这个新功能不是很快就可以添加的,所以,如果你要修改新功能的话,现有的项目就不能正常运行了。这个时候Branch
的好处就体现出来了,你可以新建一个分支,然后她并不影响你原有的项目,你也可以高兴的添加新功能,当你新功能添加完成后,还可以合并两个分支关于分支的介绍可以参考廖雪峰老师的教程,Branch可以分为这几类,Bug分支,feature分支(功能分支)下面介绍一些分支的常用命令:
git checkout -b dev
git checkout
命令加上-b
表示创建并切换分支,相当于这两条命令git branch dev
,git checkout dev
.git branch
会列出所有的分支,并在当前分支前标*
git merge branch_name
将名为branch_name的分支与当前分支合并,如果分支存在冲突,我们将手动处理冲突。git branch -d branch_name
将名为branch_name的分支删除,不能删除自己正在的那个分支,不能自己杀自己嘛git log --graph
可以查看分支合并图。- 补充,由于前面讲到的撤销操作的命令也是
git checkout -- file_name
,这就很迷惑了,Git还有一种切换分支的命令为git switch branch_name
,gti switch -c branch_name
,创建并切换 - 合并分支时,Git会适应
Fast firward
模式,但是这个模式,删除分支之后,会丢掉分支细腻些,如果禁用Fast forward
,Git就会在merge时生成一个新的commit,这样就可以从分支历史上看到这些信息。其方法是git merge --no-ff -m "comimit说明" merge_name
最后,Git鼓励大量使用分支! - 补充:在提交的过程中出现了一个这样的错误
nothing added to commit but untracked files present
,意思就是还有未提交文件的存在。如果不想提交这些文件,可以新建一个.gitignore
将不需要提交的文件加在里面,如果需要提交的话就一一提交就ok了参考连接 - 关于分支策略,一般
aster
应该是非常稳定的,而其他分支是不稳定的。 - bug分支,举个例子,就是当你在建一个新功能时,不巧,另一个分支上出现了bug,但是你现在的工作又没结束,不能提交,但是bug又急需处理,这是可以使用
git stash
来保存工作现场。然后去处理BUG,处理完之后怎么回到刚才的。可以使用git stash list
查看,然后有以下几种方法来恢复工作区的文件- 使用
git stash apply
恢复,但是恢复后stash的内容不删除,可以使用git stach drop
来删除 - 使用
git stash pop
恢复的同时把stash的内容也删除了 - 如果多次stash,可以使用
git stash list
查看,然后使用git stash apply stash@{num}
- ****关于这个的说明,
git stash
不能将未跟踪的文件压栈,什么是未跟踪的文件,emmm,就是你新建的文件或者文件夹,还没有被add
过。也就是Untracked file
- 如果要丢弃一个没有合并过的分支,可以使用
git branch -D <name>
进行强制删除,但是,删除了就没了~ - 多人协作的工作模式同常时这样的(摘自聊学分的教程)
- 首先试图用
git push origin <branch_name>
; - 如果推送失败,则因为远程的分支比本地的更新,可以先
git pull
试图合并 - 如果合并失败,则解决冲突并在本地提交;
- 没有冲突或者解决掉冲突就能推送成功
ps: 在本地创建和远程分支对应的分支,使用
git checkout -b branch_name origin_name
,建立本地分支与远程分支的关联git branch --set-upstream branch_name origin/branch-name
- 首先试图用
- 使用
标签嘛,很好理解,就是一串人能记住的数字且为了方便查阅而存在的,Git中也有标签,Git的标签是指向commit的。类似于分支,但是分支可以移动,标签不行。
git打标签非常简单.首先切换到需要打标签的分支上git switch branch_name
,然后执行命令git tag v1.0
,v1.0
即为标签名,也可以使用git tag
查看标签,如果需要给以前的commit打标签,使用git log
查看对应的commit id
,然后使用命令git tag v0.9 commit_id
,注意:git tag
给出的顺序不是按你打标签的时间顺序,而是按字母的排列顺序,还可以创建带说明的标签git tag -a tag_name -m 说明 commit_id
,git show tag_name
可以查看标签说明。
关于git push
中标签的说明,一般git push
是不会将标签上传到远程仓库的,需要使用git push origin tag_name
.如果要一次性推送很多标签,可以使用命令git push origin --tags
,要删除标签可以使用git tag -d tag_name
.
至此,我们应该对这个版本控制工具有了一个比较好的认识了。希望大家用的愉快!