git工作原理
基本概念
git有三个区域:工作区、暂存区(称为stage或index)、版本库(Repository)
要使用git将文件保存到版本库中,需要先使用git add <filename>
命令将文件从工作区添加到暂存区(stage),然后使用git commit -m "<提交声明>"
命令将文件从暂存区提交到版本库中当前所在分支(默认是master分支)。
git 命令学习
-
创建版本库:
git init
本命令会在当前文件夹下创建一个git版本库
-
添加文件到暂存区:
git add <filename>
将要提交的文件添加到暂存区
-
提交:
git commit -m "message"
将暂存区中的文件提交到版本库
添加到暂存区中的文件才会被提交!!
-
查看工作区状态:
git status
此命令可以列出:
- 当前目录所有还没有被git管理的文件
- 被git管理且被修改但还未提交(git commit)的文件
-
查看某一文件相较于最近一次提交的改动:
git diff <filename>
只跟当前分支的最后一次提交记录比较(若改变分支,则文件也随之改变,故没法比较)
若
git diff
后面不带参数,则会列出所有已提交文件的改动可以跟某个版本比较:
git diff HEAD^^ <filename>
-
查看提交日志:
git log
显示从最近到最远的记录(若超过一屏,则会分屏显示,按q退出,按Enter输出下一屏)
使用
git log --graph
可查看分支图 -
查看历史命令:
git reflog
此命令可实现查看曾经使用过的命令和commit id
-
撤销变更
git reset 相对位置或commit_id <filename>
将暂存区的内容回退到相对位置或者提交ID的位置,而不改变工作区的文件,若想将工作区内容也回退,则需要使用
git checkout filename
;若想直接将工作区和暂存区的内容都回退,则可使用git reset --hard HEAD~num
.必须注意:
若目录下某些文件未add和commit,则执行
git reset --hard <版本>
命令对于这些文件来说是毁灭性的!!若出现上述情况,如果文件曾经添加到暂存区,可以通过
git fsck --lost-found
命令实现找回,具体操作:[关于git reset --hard这个命令的惨痛教训](https://blog.csdn.net/qq_31608451/article/details/78342365?ops_request_misc=&request_id=&biz_id=102&utm_term=git reset --hard &utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-78342365) -
创建新分支
git branch name
删除分支:
git branch -d name
查看当前存在的分支:
git branch
强制转移分支
git branch -f name 哈希值or相对位置
- 此命令不可撤销远程分支,只对本地分支起作用
删除一个某有合并过的分支,可以通过
git branch -D name
强行删除 -
跳转分支或回退文件
git checkout <name>
默认跳转分支,若没有改分支,则将同名文件在工作区的内容回退为暂存区的内容
若想回退的文件与分支重名,则可以通过
git checkout -- filename
命令回退若想创建一个新分支并跳转过去,则可以在
git checkout
后面添加参数-b
,如下:git checkout -b <branch-name>
-
跳转分支:
git switch name
跳转到name分支,与
git checkout name
命令一样,只不过checkout
命令有跳转分支和回退文件功能,不方便;故添加switch
命令添加参数
-c
可实现创建并跳转分支:git switch -c name
-
删除文件:
git rm filename
将文件从工作区和暂存区中删除,版本库中还存在.此时还可以通过
git reset HEAD
回退。若想连带将版本库中的数据也删除,则继续执行一次git commit
命令即可。注:删除后无法回退 -
创建远程连接:
git remote add 别名 链接地址
例:创建一个链接到https://gitee.com/figght/learn.git网址的远程连接,连接的名字是:orign
git remote add origin https://gitee.com/figght/learn.git
可使用
git remote -v
查看已创建的远程连接可使用
git remote remove 名字
删除远程连接 -
将本地版本库推送到远程库:
git push 远程连接名字 本地分支
git push origin master
若远程库是空库,只需要加上参数
-u
git push -u origin master
-
拉取分支并合并:
git pull
一般语法为:
git pull 远程主机名 远程分支名:本地分支名
例如:
git pull origin master:dev
表示将远程主机origin上的master分支拉取下来并合并到本地master分支中若想将拉取的分支与当前本地分支合并,则冒号(
:
)后的内容可以省略:git pull origin master
若想直接使用
git pull
拉取并合并分支,则需要建立追踪关系(tracking
)。比如:- 克隆
git clone
时,会默认将本地分支与远程主机的同名分支建立追踪关系。 - 可通过命令
git branch --set-upstream-to=远程主机名/远程分支名 本地分支名
手动建立追踪关系,此时使用git pull
可直接拉取并合并对应的分支。
git pull origin master
相当于git fetch origin
+git merge origin/master
- 克隆
-
克隆远程库:
git clone ssh地址
git clone git@gitee.com:figght/learn_clone.git
-
合并分支
-
git merge <name>
本命令将name分支合并到当前指针指向的分支
若在创建新分支后原分支又提交过,则合并时会产生冲突,需要手动解决
普通合并是直接将分支指向待合并分支,若删除分支,会丢掉分支信息,即看不出来曾经有分支被合并;使用
--no-ff
参数会在合并时生成新的提交,可以看出来曾经有分支被合并。普通合并 禁用 Fast Forward
模式会丢掉分支信息 不会丢掉分支信息 看不出来有过分支合并痕迹 可以看出有分支合并痕迹 -
git rebase <name>
将name分支转移到主分支master之后
-
-
保存工作现场:
git stash
使用场景:正在使用dev分支开发时,突然想用修复master分支上的bug(即在master分支上创建新的bug分支),但是当前dev分支上正在开发的工作还没做完,还不能提交。那么就可以使用
git stash
命令保存工作现场,然后跳转到master修改bug.开发完成之后回到dev分支恢复现场即可。恢复现场:
git stash apply
或:git stash pop
;区别是:git stash apply git stash pop 恢复现场,但不会删除stash内容;若需要删除stash内容,使用命令 git stash drop
恢复现场的同时也会将stash内容删除 当多次stash后,恢复现场时可以先试用
git stash list
查看,然后指定要恢复的stash现场。例如:git stash apply/pop stash@{0}
查看stash:
git stash list
-
将特定的提交复制到当前分支:
git cherry-pick 提交ID
-
创建标签:
git tag tag-name <commit-id>
若指定
commit-id
,则默认添加标签到HEAD指向的提交记录。使用
git tag
查看当前分支中的所有标签使用
git tag tag-name -m "message-for-tag" <commit-id>
可为指定commit-id
的提交打上带有注释的标签。若想为已有标签添加注释,只需要在tag-name
前面加上参数-a
即可。使用
git log
可查看到各个标签。使用
git show tag-name
可看到位于标签处的提交的详细信息。使用
git tag -d tag-name
删除标签。标签不会自动推送到远端,若想推送标签到远端,需要手动推送
git push <romote-name> tag-name
:推送某个标签到远端git push <remote-name> --tags
:推送所有未推送到远端的标签到远端删除已经推送到远端的标签:
- 首先,删除本地标签:
git tag -d tag-name
- 然后,删除远端标签:
git push <remote-name> :refs/tags/tag-name
- 首先,删除本地标签:
-
-
git revert <name>
-
回退到当前HEAD指向的记录的前一个记录,(相当于将HEAD指向的记录撤销,并提交有关之前的记录
杂项
-
设置git bash启动默认路径
找到git bash的快捷方式,打开属性,将目标栏最后的
--cd-to-home
删掉,并将起始位置栏改成要设置的路径。 -
相对位置:
^
:上一条~数字
:以上多少条 -
在GitHub上见到好的项目想要克隆下来推送时,需要先
Fork
到自己的仓库,然后再克隆自己仓库的项目到本地,不然直接克隆别人的项目会导致没有权限推送修改。 -
若发现自己
Fork
的项目有bug并且修复了的话,可以通过pull request
给官方贡献代码(不一定接受)。 -
若当前工程中只有部分文件需要添加到版本库,其他文件不添加,需要在工程目录(与
.git
文件夹同一级的目录)下创建一个.gitignore
文件。.gitignore
忽略规则:格式 说明 #string 注释 .abc 忽略所有后缀为".abc"的文件 !.bcd 不忽略后缀为".bcd"的文件 /abc 只忽略项目根目录下的abc文件,不包括项目下文件夹的同名文件 dir/ 忽略dir文件夹下所有文件 若在添加
.gitignore
文件前已经add
或commit
过,则规则不会生效,此时需要清空本地缓存:git rm -r --cached . #-r:递归 git add . git commit -m "update file .gitignore"
也可以直接删除
.git
文件夹,然后再次执行git init
,然后添加、提交下面是keil5编写51程序时的
.gitignore
文件内容:#取消忽略.c、.h和.A51文件 !*.c !*.h !*.A51 # #忽略.gitignore文件 # .gitignore #忽略这两个文件夹下的所有文件 Listings/ Objects/ #忽略全部后缀为这些的文件 *.lst *.m51 *.obj *.zxp14 *.uvproj *.uvopt *.__i *.htm *.lnp *.hex