配置
验证当前本地属性:
Git 一共有3个配置文件:
1. 仓库级的配置文件:在仓库的 .git/.gitconfig
,该配置文件只对所在的仓库有效。
2. 全局配置文件:Mac 系统在 ~/.gitconfig
,Windows 系统在 C:Users<用户名>.gitconfig
。
3. 系统级的配置文件:在 Git 的安装目录下(Mac 系统下安装目录在 /usr/local/git
)的 etc
文件夹中的 gitconfig
。
# 查看配置信息 # --local:仓库级,--global:全局级,--system:系统级 $ git config <--local | --global | --system> -l
# 查看当前生效的配置信息 $ git config -l # 编辑配置文件 # --local:仓库级,--global:全局级,--system:系统级 $ git config <--local | --global | --system> -e # 添加配置项 # --local:仓库级,--global:全局级,--system:系统级 $ git config <--local | --global | --system> --add <name> <value> # 获取配置项 $ git config <--local | --global | --system> --get <name> # 删除配置项 $ git config <--local | --global | --system> --unset <name> # 配置提交记录中的用户信息 $ git config --global user.name <用户名> $ git config --global user.email <邮箱地址> # 更改Git缓存区的大小 # 如果提交的内容较大,默认缓存较小,提交会失败 # 缓存大小单位:B,例如:524288000(500MB) $ git config --global http.postBuffer <缓存大小> # 调用 git status/git diff 命令时以高亮或彩色方式显示改动状态 $ git config --global color.ui true # 配置可以缓存密码,默认缓存时间15分钟 $ git config --global credential.helper cache # 配置密码的缓存时间 # 缓存时间单位:秒 $ git config --global credential.helper 'cache --timeout=<缓存时间>' # 配置长期存储密码 $ git config --global credential.helper store
从远程仓库克隆一个版本库到本地
# 默认在当前目录下创建和版本库名相同的文件夹并下载版本到该文件夹下
$ git clone <远程仓库的网址>
# 指定本地仓库的目录
$ git clone <远程仓库的网址> <本地目录>
# -b 指定要克隆的分支,默认是master分支
$ git clone <远程仓库的网址> -b <分支名称> <本地目录>
初始化一个本地版本库
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
mkdir testgit && cd testgit --创建testres文件夹并切换到testres
git init
当前目录会多一个.git的目录,默认是隐藏的,用 ls -ah 命令就可以看见
查看仓库的状态
# 查看本地仓库的状态
$ git status
# 以简短模式查看本地仓库的状态
# 会显示两列,第一列是文件的状态,第二列是对应的文件
# 文件状态:A 新增,M 修改,D 删除,?? 未添加到Git中
$ git status -s
操作远程库
# 列出已经存在的远程仓库 $ git remote # 列出远程仓库的详细信息,在别名后面列出URL地址 $ git remote -v $ git remote --verbose # 添加远程仓库 $ git remote add <远程仓库的别名> <远程仓库的URL地址> # 修改远程仓库的别名 $ git remote rename <原远程仓库的别名> <新的别名> # 删除指定名称的远程仓库 $ git remote remove <远程仓库的别名> # 修改远程仓库的 URL 地址 $ git remote set-url <远程仓库的别名> <新的远程仓库URL地址>
操作 Git 的分支命令
# 列出本地的所有分支,当前所在分支以 "*" 标出 $ git branch # 列出本地的所有分支并显示最后一次提交,当前所在分支以 "*" 标出 $ git branch -v # 创建新分支,新的分支基于上一次提交建立 $ git branch <分支名> # 修改分支名称 # 如果不指定原分支名称则为当前所在分支 $ git branch -m [<原分支名称>] <新的分支名称> # 强制修改分支名称 $ git branch -M [<原分支名称>] <新的分支名称> # 删除指定的本地分支 $ git branch -d <分支名称> # 强制删除指定的本地分支 $ git branch -D <分支名称>
检出命令,用于创建、切换分支
# 切换到已存在的指定分支 $ git checkout <分支名称> # 创建并切换到指定的分支,保留所有的提交记录 # 等同于 "git branch" 和 "git checkout" 两个命令合并 $ git checkout -b <分支名称> # 创建并切换到指定的分支,删除所有的提交记录 $ git checkout --orphan <分支名称> # 替换掉本地的改动,新增的文件和已经添加到暂存区的内容不受影响 $ git checkout <文件路径>
把已经提交的记录合并到当前分支
# 把已经提交的记录合并到当前分支 $ git cherry-pick <commit ID>
创建一个文件并加到暂缓区
# 创建ai.txt文件
$ touch ai.txt
# 把指定的文件添加到暂存区中
$ git add <文件路径>
# 添加所有修改、已删除的文件到暂存区中
$ git add -u [<文件路径>]
$ git add --update [<文件路径>]
# 添加所有修改、已删除、新增的文件到暂存区中,省略 <文件路径> 即为当前目录
$ git add -A [<文件路径>]
$ git add --all [<文件路径>]
# 查看所有修改、已删除但没有提交的文件,进入一个子命令系统
$ git add -i [<文件路径>]
$ git add --interactive [<文件路径>]
将暂缓区中的文件提交到本地仓库中
# 把暂存区中的文件提交到本地仓库,调用文本编辑器输入该次提交的描述信息 $ git commit # 把暂存区中的文件提交到本地仓库中并添加描述信息 $ git commit -m "<提交的描述信息>" # 把所有修改、已删除的文件提交到本地仓库中 # 不包括未被版本库跟踪的文件,等同于先调用了 "git add -u" $ git commit -a -m "<提交的描述信息>" # 修改上次提交的描述信息 $ git commit --amend
# 可以 直接 在后面跟上文件,表示把该文件提交到本地版本库(不推荐)
$ git commit -m "提交ai.txt文件试试" ai.txt
从远程仓库获取最新的版本到本地的 tmp 分支上
# 将远程仓库所有分支的最新版本全部取回到本地 $ git fetch <远程仓库的别名> # 将远程仓库指定分支的最新版本取回到本地 $ git fetch <远程主机名> <分支名>
合并分支
# 把指定的分支合并到当前所在的分支下 $ git merge <分支名称>
比较版本之间的差异
# 比较当前文件和暂存区中文件的差异,显示没有暂存起来的更改 $ git diff # 比较暂存区中的文件和上次提交时的差异 $ git diff --cached $ git diff --staged # 比较当前文件和上次提交时的差异 $ git diff HEAD # 查看从指定的版本之后改动的内容 $ git diff <commit ID> # 比较两个分支之间的差异 $ git diff <分支名称> <分支名称> # 查看两个分支分开后各自的改动内容 $ git diff <分支名称>...<分支名称>
拉取代码
# 从远程仓库获取最新版本。
$ git pull
推送代码
# 把本地仓库的分支推送到远程仓库的指定分支 $ git push <远程仓库的别名> <本地分支名>:<远程分支名> # 删除指定的远程仓库的分支 $ git push <远程仓库的别名> :<远程分支名> $ git push <远程仓库的别名> --delete <远程分支名>
版本记录
# 打印所有的提交记录 $ git log # 打印从第一次提交到指定的提交的记录 $ git log <commit ID> # 打印指定数量的最新提交的记录 $ git log -<指定的数量>
$ git log --pretty=oneline
git中,head表示当前版本,也就是最新的提交commit id,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,往上100个版本,写成HEAD~100
。
回退版本
# 重置暂存区,但文件不受影响 # 相当于将用 "git add" 命令更新到暂存区的内容撤出暂存区,可以指定文件 # 没有指定 commit ID 则默认为当前 HEAD $ git reset [<文件路径>] $ git reset --mixed [<文件路径>] # 将 HEAD 的指向改变,撤销到指定的提交记录,文件未修改 $ git reset <commit ID> $ git reset --mixed <commit ID> # 将 HEAD 的指向改变,撤销到指定的提交记录,文件未修改 # 相当于调用 "git reset --mixed" 命令后又做了一次 "git add" $ git reset --soft <commit ID> # 将 HEAD 的指向改变,撤销到指定的提交记录,文件也修改了 $ git reset --hard <commit ID>
修改与撤销
# 用git diff HEAD -- readme.md
命令可以查看工作区和版本库里面最新版本的区别。
# git checkout -- file
可以丢弃工作区的修改:
$ git checkout -- readme.md
# 命令git checkout -- readme.md
意思就是,把readme.md
文件在工作区的修改全部撤销,即让这个文件回到最近一次git commit
或git add
时的状态。
# 当然也可以用git reset
命令。
# 生成一个新的提交来撤销某次提交,此次提交之前的所有提交都会被保留。 $ git revert <commit ID>
标签
# 打印所有的标签 $ git tag # 添加轻量标签,指向提交对象的引用,可以指定之前的提交记录 $ git tag <标签名称> [<commit ID>] # 添加带有描述信息的附注标签,可以指定之前的提交记录 $ git tag -a <标签名称> -m <标签描述信息> [<commit ID>] # 切换到指定的标签 $ git checkout <标签名称> # 查看标签的信息 $ git show <标签名称> # 删除指定的标签 $ git tag -d <标签名称> # 将指定的标签提交到远程仓库 $ git push <远程仓库的别名> <标签名称> # 将本地所有的标签全部提交到远程仓库 $ git push <远程仓库的别名> –tags
修改文件
vim ai.txt
重命名文件或文件夹
# 重命名指定的文件或者文件夹 $ git mv <源文件/文件夹> <目标文件/文件夹>
删除文件或文件夹
# 移除跟踪指定的文件,并从本地仓库的文件夹中删除 $ git rm <文件路径> # 移除跟踪指定的文件夹,并从本地仓库的文件夹中删除 $ git rm -r <文件夹路径> # 移除跟踪指定的文件,在本地仓库的文件夹中保留该文件 $ git rm --cached
技巧
(1)将本地仓库和远程仓库关联
$ git remote add origin https://github.com/MengW9/studyrepo.git
git remote是管理远程仓库的命令,后面的add origin<地址>,表示增加了一个origin远程仓库,origin是一个指针指向了后面的value。
在将本地仓库与GitHub网站上的仓库进行关联后,便可进行推送了,但是在第一次进行推送时,需要注意的是,GitHub网站上的仓库并非是空的,在创建时创建了一个README文档,因此需要将两者进行合并才行。rebase和merge都代表合并,两者区别:rebase和bersge区别
$ git pull --rebase origin master
最后,再进行推送即可。
$ git push -u origin master
(2)查看所有的分支
$ git branch -a
查看当前分支
$ git branch
(3)删除GitHub里的文件夹
新增:删除github里的文件夹
github作为一个远程仓库如果想要删除里面的某个文件夹还要克隆再在push。
但是有时候的文件夹确实是没用的,比如idea目录下的 .idea
这时可以通过以下命令,注意这个 --cached 加文件名的形式,会删除本地仓库里的,但是不会删除实体文件
步骤:(以删除.idea文件夹为例)
$ git rm -r --cached .idea #--cached不会把本地的.idea删除
$ git commit -m 'delete .idea dir'
$ git push -u origin master
(4)问题
错误
fatal: remote origin already exists.
解决
删除git remote rm origin
(5)说明
项目增加 .gitignore 文件,可以配置不需要上传到仓库的文件