Git
Basic Git
Published: 2019-07-01

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能看到如下信息:

image-20211102225009648

此时如果需要回退到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 --hardgit 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

当然也可以在pullpush的时候去设置,比方说我们熟悉的:git push –set-upstream origin branch1

设置推送方式

git config --global push.default xxx

上面的xxx可以是:nothingmatchingupstreamsimplecurrent。对于这些模式的解释(来自官网):

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 :xxxgit 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

image-20220105232710554

这里origin代表的其实是一个路径

查看远程仓库中origin路径(origin代表的是一个路径):

git remote -v

image-20220105232808836

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 rebasegit commit --amend、pick命令、drop命令、git filter-branch -f --commit-filtergit 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