配置远程代码库(远程主机)
mkdir xxx.git
cd xxx.git
git init --bare //创建裸仓库
本地操作
- 情况1:代码在远程版本库,想拉到本地
git clone ssh://username@ip地址/xxx.git myproject
注:git clone命令会自动创建本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有master 分支)
- 情况2:代码在本地,想推送代码到远程空版本库(需要先在远程主机创建裸仓库)
git init //创建本地版本库
git remote add [remote-name] ssh://username@ip地址/xxx.git //添加远程版本库
git push [remote-name] [branch-name] //推送到远程版本库
常用git命令介绍
git config
- 设置登录凭据保存,下次push时不需要输入远程仓库的用户名和密码。
git config --global credential.helper store
- 删除保存的用户名密码
git config --global --unset credential.helper
git status
查看git仓库状态
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: a.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: GameServerDev/script/make_all.bat
Untracked files:
(use "git add <file>..." to include in what will be committed)
GameServerDev/application/db/ebin/account_to_player_id_db.beam
Changes not staged for commit:
表示已在仓库中的,且状态发生改变(修改、删除)的文件。
fetch、pull
git fetch [remote-name] //从远程仓库抓取数据到本地,但不合并到本地分支
git pull [remote-name] //从远程仓库抓取数据到本地,且合并到当前分支
git pull = git fetch + git merge
- 将本地的远程分支合并到本地分支
git merge [remote-name]/[branch-name]
注意:执行时,当前所在分支也要是[branch-name]
,否则会报"fatal: refusing to merge unrelated histories"。
git remote
git remote //查看远程仓库
git remote show [remote-name] //查看远程仓库详情
git checkout
git checkout 分支名 //切换到某分支(让HEAD指向该分支名)
git checkout 提交记录ID //让HEAD指向某个提交记录(游离的HEAD,不指向任何分支)
git checkout 提交记录ID 文件名 //用指定提交记录的版本中的指定文件覆盖工作区文件
相对引用
git checkout master^ //切换到master的父提交记录(让HEAD指向这个记录)
git checkout master~ //同上
git checkout HEAD^^ //让HEAD指向当前提交记录的前两个提交记录
git checkout HEAS~2 //同上
git branch
git branch //查看本地分支
git branch -r //查看远程分支
git branch -a //查看所有分支
git branch -av //查看所有分支,及其最新版本
git branch 分支名 //新建分支
git branch -f 分支名 提交记录ID //让分支指向某个提交记录
git branch -D [branch-name] //删除本地分支
git push origin --delete [branch-name] //删除远程分支
重命名分支
git branch -m [oldbranch] [newbranch] //重命名分支
git push origin :[oldbranch] [newbranch] //将修改后的分支推送到远程仓库
git push origin :[oldbranch] //删除远程仓库中的旧分支
git fetch --all --prune //取最新的分支信息并删除不再存在的远程分支
git merge
git merge [brach-name] //将目标分支合并到当前分支
举例:如果新增的提交记录有两个父提交记录
第一步
git merge bugFix //将bugFix分支合并到当前所在分支
第二步
git checkout bugFix //切换到bugFix分支
git merge master //再将master分支合并到bugFix分支
两个步骤如图所示:
git rebase
git rebase 目标分支名
将当前所在分支合并到目标分支。实际上就是取出从当前分支所在记录到与目标分支最近的同一父记录之间的一系列提交记录,“复制”它们,然后在目标分支所在记录逐个的放下去。
git rebase -i 目标分支名
交互式提交,会有弹出框,自主选择要合并的提交记录及其顺序。
git rebase -i HEAD~4
交互式提交,将选择的提交记录按选择的顺序放到HEAD往前4个提交之后,未选择的会被舍弃。
git rebase -i 提交id
将当前分支与目标提交id的相同祖先节点之间的一系列提交记录,自主选择重新在目标提交id之后放下去,来实现修改提交历史。
执行此命令前要先保证已被版本库跟踪的文件没有未暂存的修改。
- 如果要删除某次提交(仅适用于未push到远程的情况),可在选择界面将pick改成drop。(注意:会直接删除提交,不会将这次提交的修改放到工作区和暂存区)
git 删除分支上的某次提交(详细操作) - 如果要合并多个提交,(仅适用于未push到远程的情况),可在选择界面将最早的提交的
pick
改为squash
或s
,将其他所有提交的pick
改为fixup
或f
(这将把它们合并到前一个提交中而不产生新的提交)。
git如何压缩提交
git cherry-pick <提交号> …
//将一些提交复制到当前所在的位置(HEAD)之后
git cherry-pick 提交号1 提交号2 提交号3 ...
git restore
git restore [file-name] //使得在工作空间但是不在暂存区的文件撤销更改(内容恢复到没修改之前的状态)
git restore --staged [file-name] //将文件移出暂存区
git rm
// 把文件从工作区和暂存区同时删除
git rm <file>
// 把文件从暂存区删除,但保留在工作区
git rm --cached <file>
// 清空暂存区(如果同一个文件在暂存区和工作区都有修改,则执行失败,推荐使用"git reset .")
git rm -r --cached .
git reset 提交记录id
使当前分支指向指定的提交记录id。提交记录id可以是其他分支上的。
选项:
--soft
:保留工作区和暂存区的修改。(使用场景:当需要合并最后几次提交为1次提交的时候,可以reset到要合并的连续多个提交中的最早一个的前一个提交,再commit)。
--hard
:清空工作区和暂存区的修改(谨慎操作)
--mixed
:保留工作区,清空暂存区(默认选项)
git reset . //清空暂存区(不影响工作区)
git reset --hard 提交记录id // 回退工作区代码到已提交的某个版本,并清空暂存区
git reset HEAD~1 //将当前分支的提交记录回退一个版本
git revert
回退到之前的某个版本
git revert 提交记录ID //回退到指定的提交记录
git revert HEAD //撤销HEAD当前指向的提交记录(在当前提交记录的后面新增一个提交)
- git reset和git revert的区别:
git reset是通过把提交记录回退几个记录来实现撤销改动,回退到的提交记录之后的记录全部消失。这种“改写历史”的方式对于大家一起使用的远程分支是无效的。
git revert是在当前记录之后再加一个提交记录,这个新增的记录引入了更改,这些更改刚好撤销了目标提交记录之后的更改。为了撤销更改并分享给别人,我们需要使用git revert。
git log
注意:展示的是当前分支的提交日志
选项:
--oneline
:每个提交只在1行展示提交ID和提交信息
-p
:列出详细差异内容
-n
:限制显示的提交数量
// 查看最近两条提交记录
git log -p -2
// 显示增删改的文件
git log --name-status
// 查找某个文件的所有历史提交
git log -- [file-path]
git reflog
查看版本操作记录
git diff
-
比较工作区和暂存区之间的差异
git diff
-
比较暂存区和版本库之间的差异
git diff --cached
git diff --staged
-
比较工作区和版本库之间的差异
git diff HEAD
-
比较两个版本之间的差异(可以用HEAD作为提交id进行比较)
git diff 提交id1 提交id2
可以在上述命令之后加上文件名,即只比较某个文件。
git stash
git ls-files
查看暂存区内容
知识点
git文件状态
状态 | 描述 |
---|---|
已提交(committed) | 已提交表示数据已经保存在本地数据库中 |
已修改(modified) | 已修改表示修改了文件,但还没保存到数据库中 |
已暂存(staged) | 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中 |
工作区、暂存区和分支的关系
所有的分支共用同一个工作区和暂存区。可以往不同分支上提交记录。
HEAD
指向当前分支的最新提交节点。
HEAD~
:表示HEAD的前一个提交节点。
HEAD^
:同上。
HEAD~2
:表示HEAD之前2个提交节点。
内部细节
// 查看HEAD值
git symbolic-ref HEAD
cat .git/HEAD
实践
- 用本地的文件夹内容,新增一个远程分支
进入本地文件夹- git init
- git add .
- git commit -m “xx”
- git remote add [remote-name] [url]
- git checkout -b [new-branch-name]
- git push [remote-name] [new-branch-name]
其他
1. Git提示“warning: LF will be replaced by CRLF”
windows: 不作修改
unix: 将core.autocrlf设置为input
Git提示“warning: LF will be replaced by CRLF”最详细解释+解决方案
2. git pull或git merge时提示:
$ git merge origin/msg_flow
error: Your local changes to the following files would be overwritten by merge:
.gitignore
GameServerDev/script/script_server/dbfiles/DECISION_TAB.LOG
Please commit your changes or stash them before you merge.
Aborting
Updating 21ccd2e..50b69fa
- 方法一:放弃本地修改
(此方法本地修改的代码会被丢弃,不可找回)
git reset --hard
git reset --hard:撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有提交。
- 方法二:使用git stash
git stash
git stash:保存当前工作进度,能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录。也可以用git stash save,作用等同于git stash,区别是可以加一些注释
git stash pop:可以把你刚才stash到本地栈中的代码pop到本地(也可以用git stash apply,区别:使用apply恢复,stash列表中的信息是会继续保留的,而使用pop恢复,会将stash列表中的信息进行删除。)
git stash list:存储到本地栈顶以后,你可以使用git stash list 查看你本地存储的stash日志
git stash clear: 清空Git栈,原来stash的节点都会被清除。
3. git pull拉取代码时提示
17931@DESKTOP-TO8UUAE MINGW64 /e/xxl/xxl_server (master)
$ git pull origin
You asked to pull from the remote 'origin', but did not specify
a branch. Because this is not the default configured remote
for your current branch, you must specify a branch on the command line.
git pull origin master
带上分支名后:
17931@DESKTOP-TO8UUAE MINGW64 /e/xxl/xxl_server (master)
$ git pull origin master
From https://gitee.com/shanghai-yicen-network/dongfang-net-unity-erlang
* branch master -> FETCH_HEAD
fatal: refusing to merge unrelated histories
17931@DESKTOP-TO8UUAE MINGW64 /e/xxl/xxl_server (master)
$ git pull origin master --allow-unrelated-histories
From https://gitee.com/shanghai-yicen-network/dongfang-net-unity-erlang
* branch master -> FETCH_HEAD
error: The following untracked working tree files would be overwritten by merge:
GameServerDev/script/script_server/log/crash.log
GameServerDev/script/script_server/log/error.log
Please move or remove them before you merge.
Aborting
Merge with strategy ort failed.
windows git中文乱码
解决方法:
git config --global core.quotepath false
git config --global gui.encoding utf-8
git config --global i18n.commit.encoding utf-8
git config --global i18n.logoutputencoding utf-8