1 git教程
代码托管平台: github、acgit(基于开源的gitlab搭建)、gitee、
1.1 git基本概念
- 工作区: 仓库的目录。工作区是独立于各个分支的。
- 暂存区: 数据暂时存放的区域。类似于工作区写入版本前的暂存区。暂存区是独立于各个分支的。
- 版本库: 存放所有已经提交到本地仓库的代码版本。
- 版本结构: 树结构,树中每个节点代表一个代码版本
1.2 git常用命令
1.git config --global user.name xtzy
: 设置全局用户名,信息记录在~/.gitconfig
文件中
2.git config --global user.email xxx@xxx.com
: 设置全局邮箱地址,信息记录在~/.gitconfig
文件中
3.git init
: 将当前目录配置成git仓库,信息记录在隐藏的.git文件夹中
4.git add xx
: 将xx文件添加到暂存区
git add .
: 将所有待加入暂存区的文件加入暂存区
5.git rm --cached xx
: 将文件从仓库索引目录中删除(不希望管理哪个文件就用这个)
6.git commit -m "备注信息"
: 将暂存区的内容提交到当前分支(执行完 暂存区的内容都会删除)
7.git status
: 查看仓库状态
8.git diff xx
: 查看xx文件相对于暂存区修改了哪些内容
9.git log
: 查看当前分支的所有版本
git log --pretty=oneline
: 一行显示,更加清楚
10.git reflog
: 查看HEAD指针的移动历史(包括被回滚的版本)
11.git reset --hard HEAD^
或git reset --hard HEAD~
: 将代码库回滚到上一个版本(内容不会删掉)
got reset --hard HEAD^^
: 往上回滚两次,以此类推git reset --hard HEAD~100
: 往上回滚100个版本git reset --hard 版本号
: 回滚到某一个特定版本
12.git checkout xx
或 git restore xx
: 将xx文件尚未加入暂存区的修改全部撤销
(工作区相对于暂存区的修改全部删除 即回滚到暂存区的内容)
13.git remote add origin git@git.acwing.com:xxx/XXX.git
: 将本地仓库关联到远程仓库
14.git push -u (第一次需要-u以后不需要)
: 将当前分支推送到远程仓库
git push origin branch_name
:将本地的某个分支推送到远程仓库
15.git clone git@git.acwing.com:xxx/XXX.git
: 将远程仓库XXX下载到当前目录下
16.git checkout -b branch_name
: 创建并切换到branch_name
这个分支
17.git branch
: 查看分支
18.git checkout branch_name
: 切换到branch_name
这个分支
19.git merge branch_name
: 将分支branch_name
合并到当前分支上
20.git branch -d branch_name
: 删除本地仓库的branch_name
分支
21.git branch branch_name
: 创建新分支
22.git push --set -upstream orgin branch_name
: 设置本地的branch_name
分支对应远程仓库的branch_name
分支
23.git push -d origin branch_name
: 删除远程仓库的branch_name
分支
24.git pull
: 将远程仓库的当前分支与本地仓库的当前分支合并
- .
git pull origin branch_name
:将远程仓库的branch_name
分支与本地仓库的当前分支合并
25.git branch --set upstream-to=origin/branch_name1 branch_name2
:将远程的branch_name1
分支与本地的branch_name2
分支对应
26.git checkout -t origin/branch_name
: 将远程的branch_name
分支拉取到本地
27.git stash
: 将工作区和暂存区尚未提交的修改存入栈中
28.git stash apply
: 将栈顶存储的修改恢复到当前分支,但不删除栈顶元素
29.git stash drop
: 删除栈顶存储的修改
30.git stash pop
: 将栈顶存储的修改恢复到当前分支,同时删除栈顶元素
31.git stash list
: 查看栈中所有元素
31.git restored --stage xx
: 将暂存区的文件从暂存区撤出,但不会更改文件 (我还要管理这个文件)
1.2.1 误删代码进行回滚(直接回滚历史版本也行 看自己需求)
首先用git status
查看状态,若已经git add .
存入暂存区,则须使用git restore --staged xx
将误删文件撤离暂存区(即从暂存区扔出来)
然后使用git retore xx
将误删文件进行回滚。
1.2.2 回退到历史版本,然后再回到当前版本
首先用git reset --hard 版本号
进行回滚, 然后用git reflog
查看head指针,取出最新版本前七位的版本号
使用git reset --hard 版本号
回到最新版本
1.2.3 结点怎么删掉?(用的不多,想用就查,狠狠的查)
1.2.4 其实本地就可以进行代码管理,管理代码都存在.git文件夹里
1.2.5 将当前目录映射到git上的一个仓库目录(本地和远程对应起来)
git remote add origin git@git.acwing.com:xtzy/project.git
git push -u origin master //即可完成操作
1.2.6 将项目迁移到全新服务器
# 模拟 先把project删除
rm project -rf
git clone git@git.acwing.com:xtzy/project.git
# 引用记录为空
# 本地不用担心误删啦 随时随地可以把项目文件夹克隆下来
1.3 分支操作(在公司用到)
多人开发一般不会在主分支上开发,需要开多分支。
1.3.1 合并分支
# 模拟场景
#创建分支 从master结点继承下来的 和当前版本表示一样
git checkout -b dev
# 查看分支
git branch
# 改变readme.txt值 +777 (暂存区和分支是独立的)
vim readme.txt
git add .
# 持久化操作 (当前在dev分支上)
git commit -m "add 777"
# 回到master目录
git checkout master
# 合并 dev 分支 用的是快速合并模式(没有产生复制,直接将master分支的head结点指向了dev)
# 如果要强行复制 + -noff (用的不多)
git merge dev
# 删除dev分支 master和dev共用这个点 然后把dev分支删掉
git branch -d dev
1.3.2 合并分支时产生冲突
# 如果有冲突
# 还原冲突场景
git checkout -b dev2
# 加一个 999
vim readme.txt
git add.
git commit -m "888"
# 切换master分支
git checkout master
# 加 888
vim readme.txt
# 此时合并会产生冲突
git merge dev2
# 这时候read.txt 会多东西 需要手动合并
vim read.txt
git add .
git status
# 持久化
git commit -m "fix conflicts"
# 删除分支dev2
git branch -d dev2
# 将本地的分支提交到云端 第一次需要加-u
git push
1.3.3 将本地的分支推向云端
# 模拟场景
git checkout -b dev3
# 添加aaa
vim read.txt
git add .
git commit -m "aaa"
# 错了 当前分支没有云端分支
#git push
git push --set-upstream origin dev3
# 删除分支 需要去其他分支才能删
git checkout master
# 云端分支和本地分支比较独立 这里删了 云端的分支也不会删除
git branch -d dev3
# 删除云端分支
git push -d origin dev3 # 项目在wsl里 做到此处 后面的基本差不多搞清楚了
1.3.4 云端分支传到本地
# 创建新分支dev4
git checkout -b dev4
# 添加bbb
vim readme.txt
git add .
git commit -m "bbb"
# push到云端
git push --set-upstream origin dev4
# 切换到master分支 删除dev4 这时云端有dev4 本地没有
git checkout master
git branch -d dev4
# 把云端的分支push到本地
git checkout -b dev4 # 先创建分支 最好和云端的分支名字一样
git branch --set-upstream-to=origin/dev4 dev4 # 将本地和云端的分支绑定到一块
git pull # 拉取云端分支 简单认为 拿下来 在 merge
# 然后就可以在本地将master 和 dev4 分支合并
git checkout master
git merge dev4 # 此时readme.txt 里有bbb
vim readme.txt
# 现在就可以删除本地和云端的dev4分支
git branch -d dev4
git push -d origin dev4
git status
git push # 将远程的分支合并到当前分支
# 也可以是云端某个分支传到本地某个分支
git checkout -b dev5
# 添加ccc
vim readme.txt
git add.
git commit -m "777"
git push --set-upstream origin dev5
# 切换master分支 将本地分支删除
git checkout master
git branch -d dev5 # 此时云端多了个分支dev5 比master分支多了写内容
# 云端的分支合并到本地的某个分支
git pull origin dev5 # 云端的dev5分支合并到master分支 当前处于master分支
# 本地可以合并本地的 本地可以合并云端的 云端合并云端(纯在页面操作)
git push
# 删除云端分支dev5
git push -d origin dev4
1.4 stash操作
git checkout -b dev6
# 加ddd
vim readme.txt
git add readme.txt
git commit -m "ddd"
# 再修改一个 加eee
vim readme.txt # 此时工作区和暂存区都有修改内容
# 如果此时服务器挂了 要修改又不希望将当前日志内容提交到版本库里
git stash # 将当前修改存在一个栈里 这样工作区和暂存区就没有东西了 可以使用git status查看
git stash list # 查看栈里的所有内容
# 创建新分支
git checkout dev7
# 添加 fff
vim readme.txt
git add .
# 持久化
git commit -m "fff"
git checkout dev6
git merge dev7
git branch -d dev7
# 着手把刚刚没做完的内容回复回来
git stash pop
git status
git add .
git commit -m "fff"
git checkout master
git merge dev6
git add .
git commit -m "fix confilcts" # 可能没有冲突
1.5 多个同学合作
多人开发一般都不会再master上开发,在dev分支上开发
git checkout -b dev
# 传到云端
git push --set-upstream origin dev
# 另一个服务器 新的机器
# 先加新机器的公钥传到云端 加到账户里
ssh keygen
cd .ssh/
...
# 拉取代码 clone 一般只有一个分支
git clone git clone git@git.acwing.com:xtzy/project.git
git checkout -d dev
git branch --set-upstream-to=origin/dev dev # 本地的和云端的分支对应
git pull
# 然后我们在本地修改了代码 小伙伴也修改了 修改的内容不同 且都持久化了
vim readme.txt
# 现在状态是云端有一个dev分支 我们自己也有一个dev分支 小伙伴也有一个dev分支 但内容不一样
# 且小伙伴已经push上去了 这意味着云端分支就是小伙伴的内容
# 这时候我们push上去 就会报错 有冲突
# 这时候要解决冲突 要git pull将云端的分支拉到分支解决冲突
# 这个一般不会发生 以为写的是不同文件 如果写的是相同文件的化冲突就会发生
git pull
git add .
git commit -t "fix conflict"
git push # 这样云端的分支就会更新为你处理冲突完之后的版本
1.6 用git来统计代码量
find -name '*.java' | xargs cat | wc -l