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的时候是需要验证用户名和密码的。而SSH
在push
的时候,是不需要输入用户名的,如果配置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
来结束一行,而Mac
和
Linux
平台只使用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 -> commit
和push
。解决很简单,添加一个--allow-unrelated-histories
参数即可:
$ git pull test main --allow-unrelated-histories
关于主机授权
如果提示`The authenticity of host ...