爱学习的好孩子

git

时间: 2024-06-09

简介

目前进入安装页面

如果要修改Git Bash的默认用户根目录,只需要在用户环境变量部分新建Home变量,值为新的目录路径即可。

语法

git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]
    [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
    [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
    [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
    [--super-prefix=<path>] [--config-env=<name>=<envvar>]
    <command> [<args>]

command说明

command 说明
clone 将存储库克隆到新目录中
init 初始化Git仓库
add 将文件内容添加到索引
mv 移动或重命名文件,目录或符号链接
restore Restore working tree files
rm 从工作区和索引中删除文件
bisect 通过二进制查找引入错误的更改
diff 显示提交,提交和工作树等之间的更改
grep 打印匹配图案的行
log 显示提交日志
show 显示各种类型的对象
status 显示工作树状态
branch 列出,创建或删除分支
commit 将更改记录到存储库
merge 加入两个或更多的开发历史
rebase 转发端口本地提交到更新的上游头
reset 将当前HEAD复位到指定状态
switch 切换分支
tag 创建,列出,删除或验证使用GPG签名的标签对象
fetch 从另一个存储库下载对象和引用
pull 从另一个存储库或本地分支获取并合并
push 更新远程引用以及相关对象

基础入门

从零开始

我们在F盘新建一个gitTest目录,后续操作都针对此目录,在目录下输入以下命令:

# 查看git状态
[root@god ~]# git status  
fatal: not a git repository (or any of the parent directories): .git

# 初始化仓库
[root@god ~]# git init
Initialized empty Git repository in F:/git/.git/

Git会在当前目录创建一个空的仓库,建立一个.git的目录。

Caution

这个目录是Git用来跟踪管理版本库的,不要手动修改这个目录里面的文件。

如果你是Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文

在将文件加入版本库之前,我们需要了解Git管理本地数据的基本概念,大概可以分为三个区:

  • 工作区(Working Directory), 就是你平时存放项目代码的地方。
  • 暂存区(Stage/Index), 用于临时存放你的改动,事实上它只是一个文件,保存即将提交到的文件列表信息, 一般存放在.git目录下的index文件中,所以也把暂存区叫作索引
  • 资源库(Repository或Git Directory), 就是安全存放数据的位置,这里面有你提交到所有版本的数据, 其中HEAD指向最新放入仓库的版本。
# 新建test.txt
[root@god ~]# echo Hello World > test.txt

# 查看git状态
[root@god ~]# git status
On branch main
No commits yet
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        test.txt
nothing added to commit but untracked files present (use "git add" to track)

# 把文件添加到暂存区
[root@god ~]# git add test.txt

# 将文件提交到仓库
[root@god ~]# git commit -m first
[main (root-commit) c2ed7f9] first
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt

# 查看版本
[root@god ~]# git log
commit c2ed7f968a3542a0ab8f2dcb63a3f9b6dc152142 (HEAD -> main)
Author: Adong <888888@qq.com>
Date:   Mon Oct 17 20:02:32 2022 +0800
    first

如果要添加多个文件,可以使用git add .来添加当前目录下全部的文件!

下面我们继续。

# 新建second.txt
[root@god ~]# echo I am jack. > second.txt
[root@god ~]# git add .
[root@god ~]# git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   second.txt

# 把second.txt从暂存区域移除
[root@god ~]# git rm --cached second.txt

[root@god ~]# git status
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        second.txt
nothing added to commit but untracked files present (use "git add" to track)

[root@god ~]# git add .
[root@god ~]# git commit -m v2.0
On branch main
nothing to commit, working tree clean

[root@god ~]# git log
commit 0f220db755498a0ab3a504ccbf731e279ad259cd (HEAD -> main)
Author: Adong <888888@qq.com>
Date:   Mon Oct 17 20:15:38 2022 +0800

    v2.0

commit c2ed7f968a3542a0ab8f2dcb63a3f9b6dc152142
Author: Adong <888888@qq.com>
Date:   Mon Oct 17 20:02:32 2022 +0800

    first

进阶

使用reset和checkout撤销对文件的修改

[root@god ~]# echo What a shit do. > second.txt

现在我们修改了second.txt。假设我们在对代码进行了大量修改,突然发现程序无法运行了,但是自己早就不记得具体修改了哪些地方,这个时候想要回到上一次commit时的状态,怎么办呢?这时分为两种情况:

(1)在工作区修改,但并未提交到暂存区(即并没有add),这和我们当前的情况一样。

[root@god ~]# git checkout -- second.txt
Updated 1 path from the index

若想撤销工作区中所有文件的修改,则使用git checkout -- .

(2)工作区修改了之后,提交到了暂存区(已经add),如何撤销修改?这里又分为两种情况。

我们首先运行下面命令:

[root@god ~]# echo What a shit do. > second.txt
[root@god ~]# git add .

①如果你已经有了commit的记录,也就是我们现在的情况。

# 首先让second.txt回到工作区的状态
[root@god ~]# git reset HEAD second.txt
[root@god ~]# git checkout -- second.txt

②对于该文件来说,在当前分支上,你还没有commit过一次。坦白说,那就无能为力了。

创建分支

# 查看所有分支  
[root@god ~]# git branch

# 新建test分支  
[root@god ~]# git branch test

# 切换到test分支  
[root@god ~]# git switch test

使用GitHub

注册(略)。我们先创建一个公开仓库,比如test仓库,地址为:https://github.com/your_name/test.git

将本地仓库上传到远程仓库

虽然我们已经在GitHub建立了仓库,但是Git并不知道,那么如何让Git知道我们有了一个远程仓库呢?这个时候就需要在Git中先添加远程仓库,命令格式为:git remote add [shortname] [url]shortname就是别名。下面我们运行命令:

git remote add test https://github.com/Heart-King/test.git

运行后我们可以通过不加参数的git remote命令查看当前的远程库。现在,我们就可以把刚才已经建立的本地仓库文件,推送到远程仓库了。

::: danger 注意 需要记住的一点是,所谓的远程库,也仅仅是当前仓库的远程库!也就是说你在其他目录建立一个新的仓库后,它是没有这个远程库的,你需要另外添加。 :::

git push test main

test是远程仓库的名字,main是我们本地仓库的名字。

这个时候会提示我们输入GitHub的账号和密码,按提示输入即可。

test是我们自己刚才取的,那这个main名字是哪里来的呢?其实这是系统默认给我们取的。可以使用如下命令查看:

git branch

通常我们的主要分支名字默认都是叫main,如果我们要修改分支名字,我们输入以下命令给它重命名:

git branch -m main adong

这里需要注意的一点就是:我们给分支修改名字后,再推送到远程仓库的时候,远程仓库也会创建一个新的叫adong的分支!!!

利用SSH通信

参考SSH,在本地生成密钥对。然后打开Github的账户设置,找到SSH and GPG keys,然后新建一个SSH key,将公钥内容直接粘贴进去就可以了。

然后运行ssh -T git@github.com,如果返回Hi XXXX! You've successfully authenticated...说明配置成功。

Caution

此时需要使用ssh地址,而不是https地址。 git clone git@github.com:520Book/reponame.git

Https和SSH的区别

Https可以随意克隆github上的项目,而不管是谁的。而SSH则是你必须是你要克隆的项目的拥有者或管理员,且需要先添加SSH key,否则无法克隆。

https url在push的时候是需要验证用户名和密码的。而SSHpush的时候,是不需要输入用户名的,如果配置SSH key的时候设置了密码,则需要输入密码的,否则直接是不需要输入密码的。

关于.gitignore文件

刚才我们通过git add来将文件加入版本库,如果需要排除一些文件不加入怎么办?

语法规范

符号 说明
# #开头的行表示注释
* 用来匹配零个或多个字符
*.a 表示忽略.a文件
*.[oa] 表示忽略所有以.a和.o结尾的文件,*~忽略所有以~结尾的文件
[] 用来匹配括号内的任一字符,如[abc],也可以在括号内加连接符,如[0-9]匹配0至9的数;
? 用来匹配单个字符;
! 用来否定忽略。比如前面用了*.txt,然后使用!*a.txt,则这个a.txt不会被忽略
/ 正斜杠在前:匹配项目跟目录;如/bin表示忽略根目录下的bin文件,/bsp表示忽略根目录下的bsp文件夹,但不忽略子目录里的user/bsp文件夹;正斜杠在后:匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件;如bsp/表示忽略bsp文件夹里的所有文件;
** 匹配多级目录,可在开始,中间,结束

.gitignore规则不生效

.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:

git rm -r --cached .
git add .
git commit -m "update .gitignore"

常用命令

git branch

# 查看本地分支,加*标记的是当前分支
git branch

# 列出远程分支
git branch -r

# 同时列出本地分支和远程分支
git branch -a

# 将本地master分支关联到远程origin/master分支,两种方法效果一样
git branch -u origin/master master
git branch --set-upstream-to=origin/master master

# 重命名分支,使用-M强制重命名。(默认是对当前分支进行操作。)
git branch -m newName
git branch -M newName

# 删除分支,使用-D强制删除。
git branch -d branchname

# 删除远程分支
git branch -d -r branchname

git cherry-pick

cherry-pick可以用来复制提交,也就是说被cherry-pick的节点提交了什么,那么进行cherry-pick的节点也将会提交什么。

git cherry-pick --abort

git config

# 修改git init后默认的分支名
git config --global init.defaultBranch main

# 设置用户名和邮箱
git config --global user.name "test"
git config --global user.email "test@gmail.com"

git checkout

# 切换分支
git checkout <branchname>

有的时候如果我们修改了文件,此时还没有任何git操作,如果希望撤销对文件的修改,回到上一次的状态,可以使用如下命令。

# 切换分支
git checkout -- filename

git log

# 查看提交历史
git log

# 比较2个分支的情况,比如查看main分支中有,而dev分支中没有的内容
git log main ^dev

git merge

# 将分支合并到当前激活的分支,提交信息为Merge branch 'test'
git merge <branchname>

# 加入test分支的提交信息
git merge test --no-commit

# 不加入test分支的提交信息
git merge test --squash

# 在合并CONFLICT后撤销操作
git merge --abort

git pull

# 拉取远程分支
git pull

git push

# 强制覆盖远程分支
git push --force origin <branchname>

# 删除远程分支
git push origin --delete <branchname>

# 删除远程tag
git push origin :<tagname>

git remote

git rebase

以下命令用来修改版本的commit信息:

git rebase -i HEAD~2
git commit --amend

# 完成rebase
git rebase --continue

git rm

# 情况缓存。
git rm -r --cached .

git tag

# 列出全部tag(按字母排序的,和创建时间没关系)
git tag

# 创建一个名为 v2.0 的标签
git tag v2.0

# 查看指定tag
$ git tag -l 'v1.4*'

# 删除本地tag
git tag -d v1.0

# 利用tag推送
git push -u myDenoLib v0.1

常见问题

无法使用taskkill命令

# 参数需要使用双斜杠,其它命令类似
taskkill //PID 11542

文件夹下右键菜单不出现出现Git Bash Here

这是由于安装时未勾选Windows Explorer intergration导致的。进入注册表HKEY_CLASSES_ROOT\Directory\Background\shell。在shell下新建项,命名Git Bash Here,然后在Git Bash Here新建字符串值,将名称设置为Icon,值为D:\Program Files\Git\mingw64\share\git\git-for-windows.ico,最后在Git Bash Here 下新建项,名字为Command,将其默认值改成D:\Program Files\Git\bin\bash.exe --login -i

关于回车符的问题

由于Windows平台使用CR+LF来结束一行,而MacLinux平台只使用LF来结束一行,可用以下命令关闭Git的警告提示。

# 仅对当前git仓库有效
git config core.autocrlf false

# 全局有效,不推荐
git config --global core.autocrlf false

强制pull覆盖本地代码

git fetch --all
# origin为remote的名字
git reset --hard origin/master
git pull

无法push

明明github上有相对应的repository,但是git push就是不成功。

remote: Repository not found.
fatal: repository 'https://github.com/XXX/xxx.git/' not found

原因是有多个git的账号,在push之前登陆了另外一个。

进入控制面板所有控制面板项凭据管理器,然后在windows凭据中删除github相关的凭证,重新验证一次就好了。

拒绝合并分支

如果提示fatal:refusing to merge unrelated histories,原因在于基于同一个仓库,做了两次完全不同的提交。比如一次提交是在github上直接创建文件并commit,而第二次是在本地还没有拉新代码的情况下修改了代码,并进行pull -> commitpush。解决很简单,添加一个--allow-unrelated-histories参数即可:

$ git pull test main --allow-unrelated-histories

关于主机授权

如果提示`The authenticity of host ...

评论