git及github的用法
git学习笔记
一、安装与基本配置
- 安装: 登陆git官网查找合适的版本安装,或者通过命令行安装,以linux为例:sudo apt-get/yum install git
- 基本配置:
- 方式一:全局配置
- git config --global user.name 'yourname'
- git config --global user.email 'youremail'
- 方式一:局部配置,适用于某一个仓库
- git config --local user.name 'yourname'
- git config --local user.email 'youremail'
- 方式三:全局配置,基本用不到
注意:当在某一个仓库中进行局部设置后,在该仓库中局部配置优先级高于全局配置
- 方式一:全局配置
二、创建仓库及基本操作
-
命令创建:git init 仓库名
-
创建文件:touch filename
-
把文件保存到缓存区:git add 文件名,当文件比较多的时候可以使用git add .
-
文件从缓存区推送到远程仓库:git push origin master
-
查看本地文件夹中的所有文件:ls -al,如果只用ls只能查看没被隐藏的文件。
-
从别的文件夹下拷贝文件到当前文件夹:cp 路径/filename new_filename
-
查看工作区和暂存区的状态:git status
-
查看本地文件夹中的所有文件:ls -al,如果只用ls只能查看没被隐藏的文件。
-
从别的文件夹下拷贝文件到当前文件夹:cp 路径/filename new_filename
-
查看工作区和暂存区的状态:git status
-
核心区:.git
-
HEAD:代表整个仓库现在工作在那个仓库上
- HEAD在.git里
- cd .git进入文件包
- cat HEAD查看HEAD
- 在哪个分支上就显示引用自哪里
ref: refs/heads/master
-
config:在.git目录下
- 进入核心区目录:cd .git
- 打开配置文件:vi/cat config
- 修改配置文件中的一些信息
-
refs:
-
heads: 里边的内容是所有分支的名字,每一个名字对应这一个分支
-
tags: 对应这之前提交的所有的标签名
每新增一个分支,heads中多一个分支名,每写一个标签,tags中多一个标签名
-
-
基本结构:
- commit
- tree:一个commit只会对应一颗树
- blob 文件名
- parent
- author
- committer
通过git提供的接口cat-file可以通过标签、ascii唯一标识码很好的访问这些内容,具体使用方法如下:
1. git cat-file -t 标识码/标签 获得的是该对象对应的类型,在git中有三种类型:commit、tree、blob, blob是文章,如果两篇文章内容完全一样,不论标题是否相同,git都会当作一个来处理。
2.git cat-file -p 标识码/标签 获取的是所属类一个中的内容。 - tree:一个commit只会对应一颗树
- commit
三、分离头指针下的注意事项
- 分离头指针:指的是没有指定分支的情况,这种情况是由于在切换分支的时候,把分支名误写成了标识码而产生的对应不到分支的情况。
git命令:git checkout 35e0daa135b08d632ef30ca6a1db9dcfebd0382d
输出结果:分离头指针下,You are in 'detached HEAD' state.
M "git\347\254\224\350\256\260.md"
Note: checking out '35e0daa135b08d632ef30ca6a1db9dcfebd0382d'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD is now at 35e0daa move readme to readme.md
- 在分离头指针的情况下如果继续开发,开发的成果极有可能被git当作垃圾给清除掉,所以切换分支的时候一定要注意写对分支名字。
- git status查看当前状态,没有指向任何的分支
git status
HEAD detached at 35e0daa
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: "git\347\254\224\350\256\260.md"
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: "git\347\254\224\350\256\260.md"
modified: readme.md
- 在分离头指针的情况下提交commit,通过git log查看结果,HEAD通常情况下是和分支名字绑定在一起的,但是当处于分离头指针的情况下的时候,HEAD单独出现,没有绑定任何的分支。
commit 11f60fdffd0e2ddab6a4cc961f0590386a33967a (HEAD) Author: liquanhui02 <17801198956@139.com> Date: Thu Mar 5 17:50:48 2020 0800 add content to readme.md
四、对比两个commit的区别
- 对比分支的区别需要使用git diff commit1 commit2
- 分支的写法:
- 两个分支的标识码:完整的标识码或者部分的标识码都可以
- 使用HEAD:
- HEAD HEAD~1, ~num表示的是第一个HEAD往上推几层,例如1标识的是父亲
- HEAD HEAD11.. 1标识第一个分支往上推一层,需要推几层写几个1
五、删除分支和文件
- 删除分支:
- 正常删除: git branch -d 分支名,这种可以正常的删除
- 强制删除:git branch -D 分支名。当使用-d删除的时候提示是否真的删除,如果删除使用-D,此时就需要用到-D了
- 删除文件:
git rm 文件名,这里的删除的是工作区和暂存区都删除
六、对提交的message作修改
-
对最近一次的message修改:git commit --amend, 进入另外一个界面,修改后保存再退出
-
除最后一次外的某一次提交的message修改:
- git rebase -i 标识码
注意:这里的标识码必须是要修改提交message的父级的标识码,这个需要特别注意,最近一次提交不能用。
- 进入界面,把需要修改messge行的pick改为reword
pick 68ce0f7 在master主线上恢复之前误删除的笔记 reword 7502007 增加修改message内容 pick d5e6e96 往期message修改 # Rebase 00c4e56..d5e6e96 onto 00c4e56 (3 commands) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # d, drop = remove commit # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out- 在第二个页面中修改message内容
- 在修改过程中出现了系统中断等异常,应该执行rm -fr "/home/liquanhui/tools/git-learning/.git/rebase-merge",再次提交分支中没有提交的内容,重新rebase
git rebase -i 00c4e5606213ea3938b3c835162157c2b1a7270b It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try git rebase (--continue | --abort | --skip) If that is not the case, please rm -fr "/home/liquanhui/tools/git-learning/.git/rebase-merge" and run me again. I am stopping in case you still have something valuable there. -
合并之前提交的连续的message:
- git rebase -i 标识符
注意:这里的标识符和上边的修改往期message的标识符用法相相似,如果希望合并3-5之间的message,标识符必须写2的,即合并中最早的message的父亲的标识府
- 在跳出的第一个页面中留下一个pick,其余的修改为squash
- 在第二个跳转页面的第二行写入合并后的message,保存
- 最后合并成功
[detached HEAD 278aff8] message修改操作事项 Date: Thu Mar 5 20:32:45 2020 0800 1 file changed, 56 insertions(), 42 deletions(-) Successfully rebased and updated refs/heads/master. liquanhui@ubuntu:~/tools/git-learning$ git log --graph -n4 -
合并之前提交的没有连续的message:
- git rebase -i 标识符
- 编写需要合并的内容,注意把需要合并的放在一起
- 保存关闭后跳转到另外一个文件,修改保存退出即可。
七、diff的用法
-
比较暂存区和HEAD所包含的文件的差异:
- 编写文件,提交到暂存区
- 查看差异:git diff --cached
注意:这里必须加上--cached
-
比较工作区中同一个文件的差异:
- 编写文件,并为提交
- 查看差异:git diff HEAD 文件1 文件2 文件
- 返回的结果是这些文件中所有修改的地方
-
比较工作区和暂存区文件之间的差异:
- 首先需要确定比较的文件是已经提交的文件,而不是新文件还未提交
- 查看差异:
- 所有文件:git diff
- 单个文件:git diff 文件名
-
查看不同分支的差异:
git diff 分支1 分支2 分支3这里会显示所有文件之间的差异
-
查看不同分支上同一个文件之间的差异:
git diff 分支1 分支2 -- 文件名注意:这里文件名和--之间必须有一个空格, 另外这里的分支也可以换成两个分支上的commit的标识码,因为分支实际上就是最近的一个commit
八、恢复文件
-
从暂存区恢复文件到HEAD:
- 恢复所有的文件:git reset HEAD
- 恢复部分文件:git reset HEAD -- 文件名1 文件名2
-
从工作区恢复到暂存区:
- 这种情况用在第一种情况处理后,想把工作区的恢复为暂存区
- 恢复部分文件:git checkout -- 文件名1 文件名2
-
取消最近的几次提交:
git reset --hard 恢复到指定的那次提交的标识码注意:这个方法要慎重使用,当使用这个方法后,HEAD指针会指向这次提交,这次提交后的所有提交都没有了,包括对应的内容也会恢复到这次提交的内容。
九、工作中处理临时加塞的情况:
- 当正在开发的时候可能会临时处理紧急的任务,而手头的工作又不能丢掉,此时需要把当前工作保存起来,等处理完临时任务时再继续开发
- 保存:git stash
- 查看保存:git stash list
- 恢复文件:
- 方式一:git stash apply,这种方式只是复制了一份给我们,stash中并为删除。
- 方式二:git stash pop,这种方式把原文件给到我们,stash中已经删除。
十、.gitignore文件
- 忽略的文件格式为:*.py/html/css/md 等等
- 忽略文件夹:文件夹
- 忽略文件夹下的某类型文件:文件夹/*.py/html/css/md 等等

浙公网安备 33010602011771号