The article contains the knowledge of Git…
生成密钥
ssh-keygen -t rsa -C “email”
.ssh文件下的config 用于配置账号
git上传大文件
有时候git上传文件会报错:remote: fatal: pack exceeds maximum allowed size
这是因为上传的文件的大小超出了限制
可以使用git-lfs
插件解决这个问题,参考:https://cloud.tencent.com/developer/article/1785066
git config
配置git提交的用户名和邮件:
格式:git config user.name 用户名;git config user.email
邮箱
查看当前的用户名和邮箱
$ git config user.name
$ git config user.email
修改git的用户名和邮箱
git add
Git add xxx/Git add .
.gitgnore失效问题
有时候我们在.gitgnore编写了规则,但却不起作用,那很可能是这种情况:使用IDEA的时候开启了自动接受git管理的功能,导致新增的文件自动被add进git本地工作栈,导致该文件被git管理,这个时候就算在.gitgnore添加了该文件的排除规则也不会起作用,原因就是它已经被git管理了
那么如何解除呢?
使用git rm --cached filename
,这样就可以不受git管理了
如果执行了上面这行代码之后还是无法解除,那就只能执行git rm或git rm -f命令将文件从工作区和暂存区删除,一般情况下这么操作之后问题都会得到解决
git rm
rm命令
作用:删除工作区的文件
如果要影响暂存区中文件,需要add和commit
如果要影响版本库中文件,需要add和commit和push
git rm命令
作用:删除工作区文件,同时将此次删除放入暂存区
注意:要删除的文件是没有修改过的,就是说和当前版本库文件的内容相同
如果要影响到暂存区文件,不需要再add了,直接commit即可
如果要影响到版本库文件,不需要再add了,直接commit和push即可
git rm -f命令
作用:删除工作区和暂存区文件,并将此次删除放入暂存区
注意:要删除的文件已经修改过,就是说和当前版本库文件的内容不同
如果要影响到暂存区文件,不需要再add了,直接commit即可
如果要影响到版本库文件,不需要再add了,直接commit和push即可
git rm --cached
命令(★)
作用:删除暂存区文件,但保留工作区的文件,并将此次删除放入暂存区(相当于是取消了git对该文件的跟踪)
如果要影响暂存区中文件,不需要再add了,直接commit即可
如果要影响版本库中文件,不需要再add了,直接commit和push即可(此时版本库中的该文件也会被删除,最终的结果就是只有工作区会保留该文件,而暂存区和版本库中该文件都会被删除)
git rm -rf --cached foldname
git rm --cached
是删除单个缓存文件,git rm -rf --cached
是删除整个缓存目录
git rm -r --cached .
如果想要删除的已缓存文件或文件夹比较多或者在使用.gitgnore时想要忽略的文件或文件夹比较多,可以使用该命令重置所有缓存(该命令会移除所有缓存索引),再次提交(add、commit)后将刷新.gitgnore指示的忽略文件
git restore与git restore --staged
git restore
指令使得在工作空间但是不在暂存区的文件撤销更改(内容恢复到没修改之前的状态)
举个例子:我修改了a.txt
文件,但是还没有将它add
到暂存区,此时使用git restore a.txt
命令可以将a.txt
文件恢复到未修改之前的状态
git restore --staged
的作用是将暂存区的文件从暂存区撤出,但不会更改文件的内容。
举个例子:我修改了a.txt
文件,并且将它add
到暂存区,此时使用git restore --staged a.txt
命令可以将a.txt
文件移出暂存区,并且修改的操作是被保留的(该文件的内容是被修改之后的内容而不是未被修改之前的内容)
查看git当前状态
Git status
git log
Git log
git log –pretty=oneline (类似的还有https://www.jianshu.com/p/0805b5d5d893)
git reflog用于查看所有版本的回退信息
Git reflog , 可以查看所有的版本回退信息,相比较之下git log –oneline就只能显示过去的。
git commit
Git commit -m xxx
Git commit –amend -m xxx
解决冲突:
git tag
创建标签
标签分为两种:轻量标签和附注标签
轻量标签很像一个不会改变的分支,它只是某个特定提交的引用。而附注标签是存储在git数据库中的一个完整对象,它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间,此外还有一个标签信息,并且可以使用GNU Privacy Guard(GPG)签名并验证。通常会建议创建附注标签,这样就可以拥有以上所有信息。但如果只是想用一个临时的标签,或者因为某些原因不想保存这些信息,那也可以使用轻量标签。
附注标签
git tag -a v1.4 -m ‘my version 1.4’ (-a制定标签名字,-m指定一条将会存储在标签中的信息。如果没有为附注标签指定一条信息,git会启动编辑器要求你输入信息)
git tag(打标签)
轻量标签
另一种给提交打标签的方式是使用轻量标签。 轻量标签本质上是将提交校验和存储到一个文件中——没有保存任何其他信息。 创建轻量标签,不需要使用 -a
、-s
或 -m
选项,只需要提供标签名字
git tag ”标签名“
这个时候使用git show “标签名"查找该轻量标签,我们将不会看到额外的标签信息,只会显示出提交信息
查看标签信息和与之对应的提交信息
git show 显示所有标签
git show “标签名” 显示某个标签
输出会显示打标签者的信息、打标签的日期时间、附注信息以及具体的提交信息
标签测试:
完成文件修改之后,git tag -a xxx1 -m xxx2,设置标签名xxx1
将某一个标签推上去Git push origin xxx(标签名)
将所有标签推上去 git push origin –tags
列出标签
git tag
模糊查找特定标签
git tag -l “v18.5*”
那就会列出所有v18.5开头的标签,比如v18.5.1、v18.5等
后期打标签
当提交了多次代码之后我们希望给其中的某几次提交的代码打上标签
此时可以使用命令:git log --pretty=oneline
显示提交信息,如下:
$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
再使用命令给某次提交打标签:
$ git tag -a v1.2 0d52aaa
删除标签
删除本地仓库标签:git tag -d “标签名”
删除远程仓库的标签,有两种方法:
-
git push origin :refs/tags/“标签名”
这种操作的意义是,将冒号前面的空值推送到远程标签名,从而高效地删除它
-
git push origin –delete “标签名”
检出标签
如果你想查看某个标签所指向的文件版本,可以使用 git checkout
命令, 虽然这会使你的仓库处于“分离头指针(detached HEAD)”的状态——这个状态有些不好的副作用:
$ git checkout "标签名"
在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支:
$ git checkout -b "新标签名" "分支名"
举个例子:git checkout -b version2 v2.0.0 意思是切到新分支version2上面并指向标签v2.0.0的文件版本
如果在这之后又进行了一次提交,version2
分支就会因为这个改动向前移动, 此时它就会和 v2.0.0
标签稍微有些不同,这时就要当心了。
git回滚
git revert
在git log查询到commit_id之后,使用git revert commit_id,之后再推送到远端即可回滚。
注意:如果在使用了一次revert之后再使用一次revert就又回去了,这是跟git reset不一样的地方(git reset会使之前的记录全部消失,回滚之后就不能再回去了,所以平时应该避免使用reset,多多使用revert)
git revert一般是这么用的:
* git revert HEAD 撤销前一次 commit
* git revert HEAD^ 撤销前前一次 commit
* git revert commitId 撤销指定的版本,撤销也会作为一次提交进行保存
* git revert --no-commit commitId 撤销指定的版本,撤销不会作为一次提交进行保存
git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。换句话说,比方说有版本1、版本2、版本3,最新的就是版本3(该版本已经提交了commit),那么如果要回滚到版本2,版本3的commit不会被影响,将文件内容撤销到版本2的操作将会被视为新的修改,如果此时再commit,那么提交的是一个新的版本
git revert还可以带-n
等参数,具体参考:https://www.git-scm.com/docs/git-revert
例子:
假设我们执行git log能看到如下信息:
此时如果需要回退到44444版本,就需要revert 555555555 版本
git reset
作用:当我们add和commit之后发现还需要修改代码或者说这次commit是错误的(对于已有文件的改动那问题也不大,但是有种情况就是本地代码库中git托管了某些新建的文件,有时候可能是大量的新建文件,这个时候想要通过git rm恢复到之前这些文件不被托管的状态是很麻烦的),这个时候如果再次commit也是可以的,只不过那些我们本不希望被托管的文件还是会被git托管,并且这样会多一次commit记录(git push之后使用git log可以看到多次commit记录),一般情况下再次commit的话上一次的commit理论上是无意义的。所以综合来看最理想的做法就是取消上一次的commit(本质上就是取消本地代码库中上一次add和commit造成的git对于代码的管理),这个时候git reset就能派上用场了,它不仅能完全取消上一次的commit(相当于没有上一次commit),还能保留工作区的所有未被git管理的代码。
选择当前指针指向的位置 git reset --hard HEAD
回退到上一个版本 git reset --hard HEAD^
回退到上两个版本 git reset --hard HEAD^^
回退到上三个版本 git reset --hard HEAD^^^
回退到某一个确定的版本 git reset --hard xxx
(用git log 获得的commit后面的遗传信息码)
回退到上100个版本 git reset --hard HEAD~100
git reset --hard
与git reset --soft
的区别:
git reset --hard
不仅会回退commit,还会将文件也恢复到未修改之前的状态,也就是说他是彻底的回退到了某个版本;而git reset --soft
不会将文件恢复到未修改之前的状态,他只会回退commit,如果还要提交,直接commit即可
具体参考:https://blog.csdn.net/yangfengjueqi/article/details/61668381
git revert与git reset的区别
- git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit
- 在回滚这一操作上看,效果差不多,但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是直接把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入
- git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够相互抵消
git branch
查看本地及远程所有的分支 git branch -a
新建分支: git branch branch1
创建并切换到新分支:git checkout -b newBranch
创建并切换到新分支,且新分支的代码指向某个标签版本:git checkout -b newBranch v1.15.1
将branch1推到远程: git checkout branch1
,切换到branch1,然后做想要的操作,最后push,遇到操作不对的时候系统会有提示,比方说(最后push的时候其实是git push –set-upstream origin branch1
)
案例:
1、在目录下使用git clone git@github.com:xxxxx/yyyyy.git
2、使用git branch查看本地的当前分支
你会看到你在master分支下
3、这个时候往往会用git checkout -b dev origin/dev这个命令
它意思是说.切换到dev分支上,接着跟远程的origin地址上的dev分支关联起来,这里要注意origin代表是一个路径,可以用git remote -v 查看。说来白了,origin/dev有点像是git@github.com:xxxxx/yyyyy.git/dev
4、接着在dev当前分支下进行操作,add,commit后,用git push origin dev,意思是推送当前的dev分支到远程origin地址的dev分支上
设置分支推送的目的地
默认将本地的dev
分支推送到origin/dev
:
git branch --set-upstream-to=origin/dev dev
git branch --set-upstream dev origin/dev
当然也可以在pull
或push
的时候去设置,比方说我们熟悉的:git push –set-upstream origin branch1
设置推送方式
git config --global push.default xxx
上面的xxx
可以是:nothing
、matching
、upstream
、simple
、current
。对于这些模式的解释(来自官网):
push.default
Defines the action git push should take if no refspec is given on the command line, no refspec is configured in the remote, and no refspec is implied by any of the options given on the command line. Possible values are:
nothing – do not push anything.
matching – push all branches having the same name in both ends. This is for those who prepare all the branches into a publishable shape and then push them out with a single command. It is not appropriate for pushing into a repository shared by multiple users, since locally stalled branches will attempt a non-fast forward push if other users updated the branch.
This is currently the default, but Git 2.0 will change the default to simple.
upstream – push the current branch to its upstream branch. With this, git push will update the same remote ref as the one which is merged by git pull, making push and pull symmetrical. See “branch.<name>.merge” for how to configure the upstream branch.
simple – like upstream, but refuses to push if the upstream branch’s name is different from the local one. This is the safest option and is well-suited for beginners. It will become the default in Git 2.0.
current – push the current branch to a branch of the same name.
The simple, current and upstream modes are for those who want to push out a single branch after finishing work, even when the other branches are not yet ready to be pushed out. If you are working with other people to push into the same shared repository, you would want to use one of these.
大体是说simple是最安全的,也非常适合初学者。simple也将是Git2.0的默认值
删除分支
把本地的分支删除 git branch -d xxx
,之后要是想将远程的分支也删除 git push origin
--delete :xxx
或git push origin :xxx
查看本地分支
git branch
查看全部分支(包含本地的和远程的)
git branch -a
如果分支太多,可以配合grep模糊查找
git branch | grep “branchName”
清理本地无效分支(远程已经删除但是本地没有删除的分支)
git fetch -p
根据指定版本号创建分支
git checkout -b branchName commitId
git switch
相较于功能较多的git checkout,git switch专门用于切换分支
参考:https://blog.csdn.net/zxlyx/article/details/124218646(git switch 命令的一些常用的用法)
git merge
合并分支 先将分支切换到master:git checkout master,然后git merge branch1即可
fork
Fork:将别人的仓库复制一份到自己的仓库
clone
Clone:将仓库克隆到自己的本地电脑中
fetch、merge、pull
fetch+merge的效果与pull一样
git pull和git pull –rebase的区别
rebase好处
想要更好的提交树,使用rebase操作会更好一点。
这样可以线性的看到每一次提交,并且没有增加提交节点。
merge 操作遇到冲突的时候,当前merge不能继续进行下去。手动修改冲突内容后,add 修改,commit 就可以了。
而rebase 操作的话,会中断rebase,同时会提示去解决冲突。
解决冲突后,将修改add后执行git rebase –continue继续操作,或者git rebase
–skip忽略冲突。
git remote
Git添加远程仓库:
git remote add origin git@github.com:michaelliao/learngit.git
Git删除远程仓库:
git remote rm origin
Git重定向远程仓库地址:
git remote set-url origin xxxxx
Git重命名origin:
git remote rename origin xxxxx
查看远程仓库当前路径:
git remote
这里origin代表的其实是一个路径
查看远程仓库中origin路径(origin代表的是一个路径):
git remote -v
git stash
git stash #可用来暂存当前正在进行的工作
git stash pop #从Git栈中读取最近一次保存的内容
git diff
git diff
用来比较文件之间的不同
具体用法参考:
https://blog.csdn.net/wq6ylg08/article/details/88798254
https://git-scm.com/docs/git-diff
git remote prune origin
有些分支在远程已经被删掉了,但在本地还未被删除,该命令就是用于清除本地的这些分支的。
参考:https://www.cnblogs.com/wangiqngpei557/p/6058115.html(聊下 git remote prune origin)
git对于提交记录的修改(git rebase
、git commit --amend
、pick命令、drop命令、git filter-branch -f --commit-filter
、git filter-branch --tree-filter
等)
参考:https://blog.csdn.net/LeoForBest/article/details/90313471(Git 删除提交\commit的log记录、修改历史提交消息、删除历史提交、修改所有提交的邮箱地址、从所有提交中删除一个文件)
一台windows上管理多个公匙
更多
更多详细命令:https://blog.csdn.net/weixin_30699831/article/details/101982286
https://www.jianshu.com/p/d641df66fd28
github网址后面加上compare就能比较各个标签之间的区别
GitHub的搜索技巧:https://www.cnblogs.com/liweiweicode/p/11918615.html