git基本命令
编程导航
git提示
每个设备都应该建立独立的分支,每天修改后,都应该上传到远端仓库。然后在网页端仓库进行合并,检查哪些修改是合适的。
github仓库里不能再建仓库,但是可以调用并嵌套。
构建仓库
目标是新建一个仓库,如下操作。
进入github官网,进入自己的账号,点击
New repository
,给仓库起个名字,其他默认,点击
Create repository
。
打开 Git Bash
端口,输入下列命令:
- 创建README.md文件并写入内容。
1 | echo "# ProgramLearn" >> README.md |
- 初始化git仓库,产生.git文件夹:
1 | git init |
- 添加写好的README.md文件:
1 | git add README.md |
- 新仓库,第一次提交代码:
1 | git commit -m "first commit" |
- 本地创建主分支:
1 | git branch -M main |
- 与远程仓库链接:
1 | git remote add origin https://github.com/Adonothing/ProgramLearn.git |
- 将本地仓库的main支推送到远程仓库:
1 | git push -u origin main |
克隆仓库
目标是从github官网上克隆仓库到本地。任意打开一个文件夹,打开
Git Bash
端口,输入下列命令:
- 初始化:
1 | git init |
- 查看状态:
1 | git status |
- 克隆代码到当前目录下:
1 | git clone GitHub网址 |
递归克隆
有些git仓库内嵌其他git仓库,普通克隆无法下载,所以有以下操作。
新建的仓库
克隆时加入选项,克隆当前仓库以及所有子仓库:
1 | git clone --recursive Github网址 |
旧仓库
对于包含了子仓库的仓库,如果我们进行了普通克隆,里面的子仓库就不会下载下来,而是一个空的文件夹。这个时候用下面的命令克隆子仓库的文件:
- 更新子模块下载地址:
1 | git submodule sync |
- 更新子模块或下载子模块:
1 | git submodule update --init --recursive |
- 从网上更新代码到本地:
1 | git pull origin 分支名 |
克隆很容易失败、出现问题,特别是子模块的克隆,更容易出现问题。应该先设置网络代理,就不会有问题。一旦出现问题无法解决的时候,就全部删除仓库,配置好网络后重新克隆。
提交仓库
提交仓库的方法如下:
- 添加修改的内容
1 | git add . |
- 查看git状态
1 | git status |
- 对修改的内容备注
1 | git commit -m ‘添加子模块’ |
注意这里不能省略commit,提交后应该在网页上看看提交结果。git commit不能省略 -m 。
- 提交修改的内容
1 | git push origin 分支名 |
分支
上面讲的都是主分支。现在我有需求,电脑上和手机上都会对代码进行修改,我希望创建两个分支,一个分支名字叫R7000,一个名字叫iPhone。然后在GitHub仓库中合并提交。这要怎么做呢?可以这样,以下是基本命令:
- 查看本地仓库对应的远程仓库:
1 | git remote -v |
结果显示远程仓库名和地址,如下:
1 | origin https://github.com/Adonothing/ProgramLearn.git (fetch) |
- 列出本地分支
1 | git branch |
结果显示如下:
1 | * 12600K |
*
表示目前所处分支。
- 列出所有分支
1 | git branch -a |
结果显示如下:
1 | * main |
- 下载分支。当第一下载仓库时,可以选择对应的分支名称:
1 | git clone -b 分支名 仓库地址 |
本地分支
介绍本地分支的创建、切换和提交。
- 创建本地分支:
1 | git branch R7000 |
查看分支结果显示如下:
1 | R7000 |
- 切换分支:
1 | git checkout 分支名 |
或者
1 | git switch 分支名 |
- 直接创建并切换分支:
1 | git checkout -b 分支名 |
或者
1 | git switch -c 分支名 |
- 推送所有分支。虽然创建了新的分支,但是还没有将本地分支推送到远端仓库:
1 | git push origin --all |
结果如下:
1 | Total 0 (delta 0), reused 0 (delta 0), pack-reused 0 |
或者推送单个分支,方法同 git push
。
远程分支
- 浏览器创建分支
在浏览器中操作。
- 如果在网页端更创建了新的分支,需要拉取到本地,才能正确显示,命令同
git pull
。或者,踪远程分支到本地:
1 | git fetch origin 远程分支名xxx:本地分支名xxx |
- 本地记得切换分支,命令同
git switch
。或者直接拉取远程分支并切换到该分支上:
1 | git checkout -b 本地分支名xxx origin/远程分支名xxx |
其中,要求本 地分支名xxx
与 远程分支名xxx
相同。
删除分支
- 删除远端分支。可以在浏览器里操作,也可以使用命令行:
1 | git push origin -d R7000 |
然后同步至本地:
1 | git remote prune origin |
- 删除本地分支:
1 | git branch -d R7000 |
删除后记得推送远端或者拉取本地,方法同
git push
,是一样的。
合并分支
本地操作
- 合并分支到当前分支:
1 | git merge 分支名 |
- 查看分合并支操作日志:
1 | git log |
本地合并分支后,及时更新远端分支,方法同 git push
。
远端操作
在网页上,当两个分支不一样时,会出现提示标志(前提是设定了分支保护),如下操作即可:
- 点击
Compare&pull request
。 - 选择双方分支,点击
Create pull request
。 - 处理请求,点击
Merge pull request
。 - 确认请求,点击
Confirm request
。
处理的时候看看前后文件的对比,是不是你想要的,如果不要合并,可以关闭请求,并终止。
添加子仓库
如果我们想在自己仓库里调用其他子仓库。如何操作呢?
- 添加子仓库。从源到本地路径。
1 | git submodule add https://github.com/Akagi201/learning-cmake.git ./docs/learning-cmake |
这时候文件夹下会产生一个文件.gitmodules用于记录子仓库的源地址和本地路径。要不然就认为添加子仓库失败。
- 添加修改的内容,同
git add
。 - 对修改的内容备注,同
git commit
。 - 提交修改的内容,同
git push
。
这样就成功了,在网页上就会找到子仓库的链接,能直接进入子仓库的源地址。有时会产生bug,在第一步子仓库虽然全部克隆下来了,但是命令端口不会自动退出、不会产生.gitmodules
文件。这时需要我们手动创建该文件,并写入:
1 | [submodule "docs/learning-cmake"] |
再继续走第二步就可以了,但是一般会报错。解决方法是在本地:
- 删除子模块的文件夹。
- 在.git/modules/路径下会产生同样名称的文件夹,也都删除。
如果还是有错误,需要退回到第一步重新开始,但是会报错:
1 | 'projectfolder' already exists in the index" |
这是由于本地git里的index文件已经记录更改,所以办法是删除掉记录,这样操作:
- 显示索引:
1 | git ls-files --stage projectfolder |
你将看到类似于:160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0 projectfolder
的信息,删除掉即可。
- 删除索引:
1 | git rm --cached projectfolder |
好了,现在可以重新添加子模块了。
图片
一般的克隆是不会下载图片的。需要递归克隆,命令同
git submodule
。
issues
issues的中文含义是问题。issues是代码讨论问题的地方,非常重要,有任何bug都可以在这里询问或者找到答案。
大文件
向仓库里添加了大文件,结果是无法存储大文件,报错内容如下:
1 | remote: error: Trace: b2adcbab0bce9ebf02ba45cb38ed13ae62fe226a26341ec1e7cb4db00774fb3a |
所以建议不要使用大文件。好像有些其他规则是支持大文件的,不做讨论。
可是我们在这里直接在文件系统中删除这个大的文件,然后再次提交,会发现这个问题并未得到解决,并带来了新的报错。因为在git中已经有了大文件添加的记录。
由于无法直接解决该问题。所以解决方法是:重新找地方克隆项目到本地,然后再重新向其中添加文件(不要添加大文件了),再上传。
回退提交
网页操作
如何在网页上回退上个提交版本?
本地操作
git 回滚
- 查看日志:git log,每个版本有自己的哈希值,记为版本号。
- 键入 q 退出日志。
- 已提交,没有push
- git reset --soft 撤销commit
- git reset --mixed 撤销commit和add两个动作
- 已提交,并且push
- git reset --hard 版本号 撤销并舍弃版本号之后的提交记录。使用需要谨慎。
- git revert 撤销。但是保留了提交记录。
- 要强制提交修改:git push -f
公共或私有
- 在设置里,通用最下面更改可见,即可更改公共或私有。
- fork 是无法私有的。