Git笔记

Git笔记

hash070 365 2022-04-10

Git创建版本库

在需要启用版本控制的文件夹下执行以下命令

git init

之后该文件夹下就会出现一个.git文件,该文件夹中的文件就是用于跟踪和管理版本库的。
在该文件夹下启用版本控制之后,让我们尝试提交第一个文件吧
首先假设当前文件夹下有一个HelloWorld.txt文件
Git提交分两步走

第一步:使用add命令将文件添加到暂存区

git add [filename]

如果想一次把当前文件夹下的多个或所有文件全部提交上,也可以使用通配符来操作。例如下面这个命令就是将当前文件夹下的所有文件全部提交到暂存区。

git add .

第二步:使用commit命令将暂存区的文件提交到当前分支

执行提交命令之后就可以将上一步添加的文件提交到当前分支了,值得注意的是commit只会提交暂存区的文件而不会去管当前文件下的状态。

git commit -m "First Commit"

-m指的是本次提交的说明,最好是有意义的信息,方便找到改动记录

Git版本控制之时光穿梭

现在我们已经成功的添加并提交了一个HelloWorld.txt文件,现在是时候开始继续修改文件了。
我们继续修改文件内容后使用git status命令查看当前状态
执行之后应该会提示这个文件已经修改了,但是还没有准备提交。
然后使用git add HelloWorld.txt命令来将这个文件提交到暂存区,
最后使用git commit -m "Second Commit"命令来将暂存区中的文件提交到当前分支
所以git提交时的一般流程如下:
使用add将文件添加到暂存区=>使用commit将暂存区的文件提交到当前分支

版本回退

现在我们已经学会了如何修改文件,然后把修改提交到Git版本库,那么现在如何回到之前的某个版本呢?
要回退到之前的某个版本,我们需要知道版本号,这时就需要git log命令了,使用这个命令可以查看提交日志,那一大串字符串就是版本号了。
现在我们需要把HelloWorld.txt回退到上一个版本,可以使用git reset命令来轻松实现。命令如下:

git reset --hard HEAD^

这时如果我们再使用git log命令查看一下提交日志就会发现现在确实会到上一个版本了。

重返未来

但是这时我们会发现一个新的问题:最新的版本消失了。那么现在是不是回不去了呢?
答案是可以回去,只要你知道那个版本号。Git会记录下你每次的操作日志,可以使用git reflog命令来查看Git的操作日志,这样就能回去了。

git reset --hard [版本号]

文件恢复

你可以发现,Git会告诉你,git checkout – file可以丢弃工作区的修改:

git checkout -- readme.txt

命令git checkout – readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
另外,Git同样告诉我们,用命令git reset HEAD 可以把暂存区的修改撤销掉(unstage),重新放回工作区。
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

文件删除

在Git中,删除也是一个修改操作,例如我们先创建并提交一个test.txt

touch test.txt
git add test.txt
git commit -m "rm test"

这时如果我们想要把这个test.txt从Git中删除掉,可以先用rm删除工作区的文件,然后再commit提交修改

rm test.txt
git commit -m "test.txt removed"

或者有时我们只是想把这个文件从Git中删除,并不想把它从本地中删除,只需要使用git rm test.txt然后再commit即可

git rm test.txt
git commit -m "test.txt removed"

远程仓库

关于如何创建远程仓库这里就不详细说了,里着重记录一下Git如何添加和使用远程仓库

添加远程仓库

Git添加远程仓库的命令如下:

git remote add [远程仓库名称] [远程仓库地址]
推送本地仓库到远程仓库
当Git定义好远程仓库后,可以使用push命令将本地仓库推送到远程仓库中。

git push [远程仓库名称] [远程仓库分支]
#当你首次推送时,你需要手动指定当前的本地分支要推送到哪个远程分支
git push -u origin master
例如从本地的master推送到远程的origin分支

删除远程仓库

当远程仓库地址变了,或者不想要远程仓库了,可以将其旧的远程仓库信息删除。当然,这不会影响远程仓库中的文件。
使用git remote rm [远程仓库名称]即可删除,删除之前可以通过git remote -v查看当前所有定义的远程仓库。

克隆远程仓库

这个就很简单了,直接使用git clone [远程仓库地址]就行了。

git clone https://github.com/acmesh-official/acme.sh.git

#如果需要克隆指定分支,则加上一个参数-b即可
#例如我要克隆dev分支的代码

git clone -b dev https://github.com/acmesh-official/acme.sh.git

修改远程仓库的url
当远程仓库地址改变时,我们也可以使用

查看已有远程仓库的地址

git remote -v

修改指定远程仓库的地址(如`origin

git remote set-url origin ssh://git@gitlab.yun.hash070.top:20023/hash070/hellogitlab.git`

检查修改后远程仓库的地址

git remote -v

分支管理

Git的一个个分支就相当于一个个平行宇宙,我们可以随意地在这些分支上切换跳跃,还可以合并分支,就好比收束世界线。无论你的仓库里面有多少文件,这些操作在Git里可以一秒内完成。
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <分支名称>
切换分支:git switch <分支名称>或者git checkout <分支名称>
创建+切换分支:git checkout -b <分支名称>或者git switch -c <分支名称>
合并某分支到当前分支:git merge
删除分支:git branch -d <分支名称>

多个Git身份

Git是通过用户名和邮箱来确认你的身份的,所以你需要修改项目的git config文件设置来实现身份切换
否则即使你开了一个GitHub小号,提交上的代码还是会显示你大号的信息,这样就不符合预期了,而且比较危险。(因为GitHub禁止一个人持有多个小号,被逮到可能会把你的大号和小号一起封掉)

方法1:直接修改项目git文件

找到当前项目下面的.git/config文件
在文件中添加如下内容

[user]
  name = 你的用户名
  email = 你的邮箱

方法2:修改全局配置(推荐)

第一个方法如果一个一个修改,一两个项目还好,如果有很多项目的话就会很麻烦且不利于管理,推荐使用修改配置文件的方法来实现
Git全局配置文件在~/.gitconfig中,如果你是windows,那么它的位置在%USERPROFILE%\.gitconfig,这是一个隐藏文件,你可能需要特别的设置才能看到它
1670038667658.webp
我们可以通过 includeIf 配置匹配不用的目录映射到不同配置文件上,然后在不同的配置文件上来进行区分配置。
例如将该文件的内容参照如下格式修改

[user]
  name = hash070
  email = hash070@foxmail.com
[includeIf "gitdir:~/zhangsanGit"]
  path = ~/.gitconfig-zhangsan

然后再在.gitconfig的同级目录下创一个gitconfig-gitee文件
在这里面写入新的用户配置

[user]
  name = zhangsan
  email = zhangsan@zzuli.com

那么C盘下的gitee文件夹下的所有git项目将会应用新的设置

多用户密钥设置

如果你开了多个GitHub小号,想使用多个密钥怎么办?
参考链接:https://gist.github.com/jexchan/2351996

Multiple SSH Keys settings for different github account
create different public key
create different ssh key according the article Mac Set-Up Git

$ ssh-keygen -t rsa -C "your_email@youremail.com"

请修改文件名,不要错误地覆盖了之前的密钥

例如,我创建了两个密钥(带pub的是公钥

~/.ssh/id_rsa_activehacker
~/.ssh/id_rsa_jexchan

然后,将他们添加进来

ssh-add ~/.ssh/id_rsa_activehacker
ssh-add ~/.ssh/id_rsa_jexchan

你也可以尝试在添加这些密钥之前将之前的缓存全部删除

ssh-add -D

最后,你可以检查你所有保存的密钥

ssh-add -l

修改ssh config,它应该在你的用户目录下的.ssh文件夹里面

$ cd ~/.ssh/
$ touch config
$ subl -a config

然后添加

#activehacker的GitHub帐号
Host github.com-activehacker
	HostName github.com
	User git
	IdentityFile ~/.ssh/id_rsa_activehacker

#jexchan 的GitHub帐号
Host github.com-jexchan
	HostName github.com
	User git
	IdentityFile ~/.ssh/id_rsa_jexchan

测试

  ssh -T [host名称]

如果你上面已经对单独文件夹设置过独立的用户名了,那么下面的设置就没有什么必要了。
Clone you repo and modify your Git config
clone your repo git clone git@github.com:activehacker/gfs.git gfs_jexchan

cd gfs_jexchan and modify git config

$ git config user.name "jexchan"
$ git config user.email "jexchan@gmail.com" 
$ git config user.name "activehacker"
$ git config user.email "jexlab@gmail.com" 

or you can have global git config git config --global user.email “jexchan@gmail.com

then use normal flow to push your code

$ git add .
$ git commit -m "your comments"
$ git push

使用方法

在经过上面的设置之后,理论上你就可以在对应的文件夹中使用小号了

用小号创建一个私有仓库

然后复制ssh clone地址

进入到配置过独立的用户名和邮箱的文件夹里面执行git clone命令
注意要修改ssh地址,示例如下

  #原sshc克隆地址
git@github.com:zhangsan/test.git
  #应修改为
git@github.com-fzhangsan:zhangsan/test.git

总之@后面的地址应该和你的~/.ssh/config文件中的名字对应
否则会出现下图第一行命令所报的错误
正确的方法是执行图中第二行所示的命令