Git安装使用gitee(码云)记录2208201631
按默认选项安装,一路next即可
可以在命令行输入命令进行配置, 也可以编辑配置文件进行配置
local大于global大于system
如果使用 git config --system 配置 , 需要有管理员权限
在安装win版git时可以选择文本编辑器
之后执行编辑配置文件的命令就会由选择的编辑器打开
git config -e
或
git config --edit
或
git config -e --local
或
git config --local -e
或
git config --edit --local
或
git config --local --edit
git config -e --global
或
git config --edit --global
或
git config --global -e
或
git config --global --edit
git config -e --system
或
git config --edit --system
或
git config --system -e
或
git config --system --edit
#设置local的user.name
$ git config --local user.name LocalUsername
#设置global的user.name
$ git config --global user.name GlobalUsername
#设置system的user.name没有成功,权限不够,
$ git config --system user.name SystemUsername2 需要管理员权限
error: could not lock config file C:/Program Files/Git/etc/gitconfig: Permission denied
# 查看local的user.name
$ git config --local user.name
LocalUsername
# 查看global的user.name
$ git config --global user.name
GlobalUsername
# 查看system的user.name , 这个名字是用管理员权限另开的一个命令窗口设置的
$ git config --system user.name
SystemUsername
# 测试不加--local --global --system 设置user.name
$ git config user.name LocalUsernameDefault
# 不加--local --global --system 设置user.name时, local的user.name被改变
$ git config --local user.name
LocalUsernameDefault
# 不加--local --global --system 查看user.name 看到的是local的user.name
$ git config user.name
LocalUsernameDefault
# global的user.name没有被改变
$ git config --global user.name
GlobalUsername
# system的user.name没有被改变
$ git config --system user.name
SystemUsername
用户名和邮箱用于标识代码使用和提交者, 与远程仓库的用户名和密码无关, 可以随便取
设置属性可以加 --add 也可以不加
--add 和 --get 可以都不用, 当变量名后面有值时自动add , 当变量名后面没有值时自动get
git config user.anme xxx
git config user.email xxx.xxx.com
或
git config --add user.name xxx
git config --add user.email xxx.xxx.com
或
git config --local user.name xxx
git config --local user.email xxx@xxx.com
或
git config --local --add user.name xxx
git config --local --add user.email xxx@xxx.com
或
git config --add --local user.name xxx
git config --add --local user.email xxx@xxx.com
git config --global user.name xxx
git config --global user.email xxx@xxx.com
或
git config --global --add user.name xxx
git config --global --add user.email xxx@xxx.com
或
git config --add --global user.name xxx
git config --add --global user.email xxx@xxx.com
会将 local , global , system 的配置内容集中显现
git config --list
git config -l
git config --global --list
git config --global -l
git config --local --list
git config --local -l
git config --system --list
git config --system -l
查看具体配置项相当于获取变量的值
当不设置值时,就能获取到值, 可以加 –get , 也可以不加
如果local的user.name有值(已设置),就显示local的user.name , local的没值就显示global的, 再没值就显示system的
git config user.name
或
git config --get user.name
git config --local user.name
或
git config --local --get user.name
或
git config --get --local user.name
git config --global user.name
或
git config --global --get user.name
或
git config --get --global user.name
git config --system user.name
或
git config --system --get user.name
或
git config --get --system user.name
# 如果local的user.email有值(已设置)则显示local的user.email , 没值则显示global的, 再不就显示system的
git config user.email
或
git config --get user.email
git config --local user.email
或
git config --local --get user.email
或
git config --get --local user.email
git config --global user.email
或
git config --global --get user.email
或
git config --git --global user.email
git config --system user.email
或
git config --system --get user.email
或
git config --git --system user.email
git config -e
或
git config --edit
或
git config -e --local
或
git config --local -e
或
git config --edit --local
或
git config --local --edit
git config -e --global
或
git config --edit --global
或
git config --global -e
或
git config --global --edit
git config -e --system
或
git config --edit --system
或
git config --system -e
或
git config --system --edit
删除配置项可以用 –unset
//删除local的user.name
git config --unset user.name
或
git config --unset --local user.name
或
git config --local --usent user.name
//删除global的user.name
git config --unset --global user.name
或
git config --global --unset user.name
//删除system的user.name , 要有管理员权限
git config --unset --system user.name
或
git config --system --unset user.name
//删除local的user.email
git config --unset user.email
或
git config --unset --local user.email
或
git cofig --local --unset user.email
//删除global的user.email
git config --unset --global user.email
或
git config --global --unset user.email
//删除system的user.email , 要有管理员权限
git config --unset --system user.email
或
git config --system --unset user.email
比如新建了一个文件夹 dir001 在h盘t目录下
进入文件夹, 打开右键菜单, 选 Git Bash Here
打开了GitBash控制台 , 执行 git init
可以看到, 在 dir001文件夹中 , 生成了 .git 的隐藏文件夹 , 本地版本库创建完成
打开GitBash
创建文件夹 mkdir /h/t/dir002
初始化文件夹 git init /h/t/dir002
/h/t/dir002 文件夹下也生成了 .git 文件夹, 成为了本地版本库
git add 到暂存区后, git commit 到版本库, 再 git push 到远程仓库分支
git add 文件路径
#添加单个文件
git add 文件路径
git add [file1路径] [file2路径] ...
git add [文件夹路径]
git add . 或 git add -A 或 git add -u
Git版本1.x
命令 | 新文件 | 修改的文件 | 删除的文件 | 描述 |
---|---|---|---|---|
git add -A 或 git add --all | √ | √ | √ | 暂存所有(新的,修改的,已删除的)文件 |
git add . | √ | √ | × | 仅暂存新文件和修改过的文件 |
git add -u | × | √ | √ | 仅修改和删除文件 |
在git版本2.x中 git add . 和 git add -A 或 git add --all 效果相同
Git版本2.x
命令 | 新文件 | 修改的文件 | 删除的文件 | 描述 |
---|---|---|---|---|
git add -A 或 git add --all | √ | √ | √ | 暂存所有(新的,修改的,已删除的)文件 |
git add . | √ | √ | √ | 暂存所有(新的,修改的,已删除的)文件 |
git add -u | × | √ | √ | 仅修改和删除文件 |
git add --ignore-removal . | √ | √ | × | 仅暂存新文件和修改过的文件 |
git add 到暂存区后,就 git commit 到版本库
git commit 主要是将暂存区里的改动给提交到本地的版本库。每次使用git commit 命令我们都会在本地版本库生成一个40位的哈希值,这个哈希值也叫commit-id,commit-id在版本回退的时候是非常有用的,它相当于一个快照,可以在未来的任何时候通过与git reset的组合命令回到这里.
每次提交都要写提交说明, 可以加 -m提交说明 , 如果没有加 -m 提交说明, 会弹出文本编辑器写提交说明
git commit -m “提交说明” 或 git commit --message “提交说明” , 如果没有空格可以不加双引号
例如
git commit --message 第一次提交
提交暂存区的指定文件到版本库, 文件用空格分隔
git commit file1 file2 ...... -m "message"
不能写成 git commit -ma “massage”
加的-a参数可以将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过git add添加到暂存区,注意,新加的文件(即没有被git系统管理的文件)是不能被提交到本地仓库的。建议一般不要使用-a参数,正常的提交还是使用git add先将要改动的文件添加到暂存区,再用git commit 提交到本地版本库。
git commit --amend 也叫追加提交,它可以在不增加一个新的commit-id的情况下将新修改的代码追加到前一次的commit-id中
如果我们不小心提交了一版我们不满意的代码,并且给它推送到服务器了,在代码没被merge之前我们希望再修改一版满意的,而如果我们不想在服务器上abondon,那么我们怎么做呢?
假如现在版本库里最近的一版正是我们想要追加进去的那版,此时是最简单的,直接修改工作区代码,然后git add,之后就可以直接进行git push到服务器,中间不需要进行其他的操作如git pull等
如果现在版本库里最近的一版不是我们想要追加进去的那版,那么此时我们需要将版本库里的版本回退到我们想要追加的那一版,想要将版本回退到我们想要的哪一版有好几种方法
第一种即是我们从服务器上选取我们需要的版本,直接进行挑拣,在服务器的提交管理页面上右上方一般会有一个Download按钮,点击会弹出一个下拉框,选择其中的cherry-pick,复制命令,之后在我们版本仓库对应的目录下运行这个命令,执行完后,使用git log -1 命令,可以查看到现在版本库里最近的一版变成了我们刚才挑拣的这版,此时再在工作区直接修改代码,改完之后进行git add,再执行本git commit --amend命令,之后git push.
使用gitk或其他的图形界面化工具,在终端输入 gitk,回车,会弹出gitk的图形界面,在界面的左侧部分陈列着版本库中的一条条commit-id,此时选中我们需要的那一版,右键点击之后会弹出一个选择菜单,如果是在master 分支上,那么其中会有一项是 Reset master branch to here,点击这项,会弹出一个名为confirm reset的确认box,选择reset type 中的hard项,再点击OK,关闭gitk图形界面,回到终端,运行git log -1命令,发现现在版本库里最近的一次提交已经是我们希望的那一版了,此时再在工作区直接修改代码,改完之后进行git add,再执行本git commit --amend命令,之后git push.
如果我们知道我们需要的版本与现在最近的版本中间隔着 n 个提交,那么我们可以直接使用git reset --hard HEAD~n命令,关于git reset 命令有详解,此时这个命令执行完后,运行git log -1 命令我们会发现现在版本库里最近的一版就是我们需要的那版,此时再在工作区直接修改代码,改完之后进行git add,再执行本git commit --amend命令,之后git push.
如果我们不知道我们需要的版本与现在最近的版本中间隔着 n 个提交,那么我们可以使用git log来查看版本库中的commit-id,找到我们需要的commit-id后,在终端中执行git reset --hard commit-id,时这个命令执行完后,运行git log -1 命令我们会发现现在版本库里最近的一版就是我们需要的那版,此时再在工作区直接修改代码,改完之后进行git add,再执行本git commit --amend命令,之后git push.
git commit 完后可以 git push
git push的一般形式为 git push <远程主机名> <本地分支名>冒号<远程分支名>
远程主机名就是用 git remote add 远程主机名 远程主机url
远程主机名默认是 origin 也可以自定义
例如 git remote add origin https://gitee.com/xxx/Test1.git
或者 git remote add 自定义名 https://gitee.com/xxx/Test1.git
git push 对比 git pull
git push <远程主机名> <本地分支名>:<远程分支名>
对比
git pull <远程主机名> <远程分支名>:<本地分支名>
git push origin master
👆等效于👇
git push origin master:master
如果该远程分支不存在,则会被新建
git push origin :master
等同于
git push origin –delete master
则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin –delete master
git push origin master:refs/for/master
或
git push origin master:refs/heads/master
这两个不是git的规则,而是gerrit的规则
refs/for :意义在于我们提交代码到服务器之后是需要经过code review 之后才能进行merge的
refs/heads 不需要 code review
git push origin master:refs/heads/master 相当于 git push origin master:master
git push origin HEAD:refs/for/master
HEAD: 是一个特别的指针,它是一个指向你正在工作的本地分支的指针,可以把它当做本地分支的别名,git这样就可以知道你工作在哪个分支
git push --force origin master
push的时候需要本地先git pull更新到跟服务器版本一致,如果本地版本库比远程服务器上的低,那么一般会提示你git pull更新,如果一定要提交,那么可以使用这个命令。
比如, 遇到Git push常见报错:Updates were rejected because the tip of your current branch is behind
另一个方法是 git pull 加 --rebase
--rebase 可在前也可在后
git pull --rebase origin master
或
git push 远程仓库名 远程分支名 --force
git push origin --delete master
等同于省略本地分支的形式
git push origin :master
git push -u origin a:b
下次只需输入
git push
git push -u origin master 如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机以及分支对应关系,这样后面就可以不加任何参数使用git push,
git push origin
git push
不带任何参数的git push,默认只推送当前分支,这叫做simple方式,还有一种matching方式,会推送所有有对应的远程分支的本地分支, Git 1.X默认使用matching,2.X默认为simple方式
如果想更改设置,可以使用git config命令。
设为 matching | git config --global push.default matching |
设为 simple | git config --global push.default simple |
git pull 命令用于从远程获取代码并合并本地的版本。
git pull 其实就是 git fetch 和 git merge FETCH_HEAD 的简写。
.git文件夹下有一个 FETCH_HEAD 文件
git pull命令用于从另一个存储库或本地分支获取并集成(整合)。git pull命令的作用是:取回远程主机某个分支的更新,再与本地的指定分支合并
在默认模式下,git pull是git fetch后跟git merge FETCH_HEAD的缩写。
更准确地说,git pull使用给定的参数运行git fetch,并调用git merge将检索到的分支头合并到当前分支中。 使用–rebase,它运行git rebase而不是git merge。
git pull <远程主机名> <远程分支名>:<本地分支名>
git pull 对比 git push
git pull <远程主机名> <远程分支名>:<本地分支名>
对比
git push <远程主机名> <本地分支名>:<远程分支名>
将远程主机 a 的 b 分支拉取过来,与本地的 c 分支合并
git pull a b:c
a 由 git remote add a http://… 定义
执行 git pull --rebase 的时候必须保持本地目录干净。即:不能存在状态为 modified 的文件。(存在Untracked files是没关系的)
如果有 modified 状态的文件 , 有两种解决方法
git fetch 四种基本用法
这将更新git remote 中所有的远程repo 所包含分支的最新commit-id, 将其记录到.git/FETCH_HEAD文件中
这将更新名称为remote_repo 的远程repo上的所有branch的最新commit-id,将其记录。
这将更新名称为remote_repo 的远程repo上的分支: remote_branch_name
这将更新名称为remote_repo 的远程repo上的分支: remote_branch_name ,并在本地创建local_branch_name 本地分支保存远端分支的所有数据。
FETCH_HEAD: 是一个版本链接,记录在本地的一个文件中,指向目前已经从远程仓库取下来的分支的末端版本。
marge和rebase都是合并, rebase是重定基点合并,只有一条历史线, 而merge有两条历史线
总结git merge和git rebase的区别:
merge:生成一个新节点,之前的提交分开显示。 rebase:不生成新节点,是将两个分支融合成一个线性的提交。