git操作
操作
git操作
入门
在github或gitee上创建一个仓库,大概都会有如下的入门提示:
# Git 全局设置:
git config --global user.name "流浪的法师"
git config --global user.email "lldfs@qq.com"
# 创建 git 仓库:
mkdir php-repop
cd php-repop
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://gitee.com/lldfs/php-repop.git
git push -u origin "master"
# 已有仓库?
cd existing_git_repo
git remote add origin https://gitee.com/chaofml/php-repop.git
git push -u origin "master"
cheat sheet
| 创建版本库 | |
|---|---|
| git clone |
克隆远程仓库 |
| git init | 初始化本地仓库 |
| 修改和提交 | |
|---|---|
| git status | 查看状态 |
| git diff | 查看变更内容 |
| git diff –cached | 查看 git add 后的变化 |
| git add . | 跟踪所有改动过的文件 |
| git add |
跟踪指定的文件 |
| git mv |
文件改名 |
| git rm |
删除文件 |
| git rm –cached |
停止跟踪文件但不删除 |
| git commit -m “commit msg” | 提交所有更新过的文件 |
| git commit –amend | 修改最后一次提交 |
| 查看提交历史 | |
|---|---|
| git log | 查看提交历史 |
| git log -p |
查看指定文件的提交历史 |
| git blame |
以列表方式查看指定文件的提交历史 |
| git diff e5216eca..HEAD |
查看某两次提交的之间的所有变化 |
| 撤销 | |
|---|---|
| git reset –hard HEAD | 撤销工作目录中所有未提交文件的修改内容 |
| git checkout HEAD |
撤销指定的未提交文件的修改内容 |
| git revert |
撤销指定的提交 |
| 分支与标签 | |
|---|---|
| git branch | 显示所有本地分支 |
| git checkout <branch/tag> | 切换到指定分支或标签 |
| git checkout -b <branch/tag> | 切换到指定分支或标签,如果不存在,则创建它 |
| git branch |
创建新分支 |
| git branch -d |
删除本地分支 |
| git tag | 列出所有本地标签 |
| git tag |
基于最新提交创建标签 |
| git tag -d |
删除标签 |
| 合并与衍合 | |
|---|---|
| git merge |
合并指定分支到当前分支 |
| git rebase |
衍合制定分支到当前分支 |
| 远程操作 | |
|---|---|
| git remote -v | 查看远程仓库信息 |
| git remote show |
查看指定远程仓库信息 |
| git remote add |
添加远程仓库 |
| git fetch |
从远程库获取代码 |
| git pull |
下载代码并快速合并 |
| git push |
上传代码及快速合并 |
| git push |
删除远程分支或标签 |
| git push –tags | 上传所有标签 |
分支
克隆
git clone git@gitee.com:xxx/xx.git
git clone https://gitee.com/xxx/xx.git
# 克隆到指定的目录中
git clone https://gitee.com/xxx/xx.git source/_posts
# 克隆指定的分支
git clone -b dev https://gitee.com/xxx/xx.git
删除
# 删除 dev 分支
git branch -D dev
# 强制删除某一分支
合并
# 合并分支,比如 在master分支上,合并dev分支
git merge dev
# 合并分支,但是不用填合并的comment 适用于
git merge dev --no-edit
3区
git分为:工作区、暂存区、版本区。还有一个远程的仓库(非必须)。
工作区
正在修改的代码,一般都在工作区,未收到git的保护,一般易丢失。
暂存区
将修改过的代码,使用git add .命令,则可以添加到暂存区。
版本区
暂存区的内容,通过 git commit -m ""命令,则添加到版本区。
回滚操作
工作区->暂存区 git add
暂存区->版本区 git commit
版本区->暂存区 git reset –mixed 版本号
暂存区->工作区 git reset –soft 版本号
版本区->暂存区->工作区 git reset –hard 版本号
工作区恢复
某个工作区的文件,恢复
git checkout – path/to/file
批量
# 方式1
git reset --hard HEAD
# 方式2
# git reset --hard HEAD^
# git pull # 再恢复
add的相反操作
# 假设使用add . 添加了新文件,而不是修改过的文件
git add .
# 使用下面方式恢复
git reset src/demo/__pycache__/__init__.cpython-38.pyc
find . -type f -name "*.pyc" -exec git reset {} \; # 批量
diff
diff命令可以快速的查看到更改了哪些内容。
以下命令中用到了commitId,一般id写出6位,能区分即可,其他命令一样。
# 工作区的变化情况,不会显示暂存区的变化。
git diff # 未缓存
# 暂存区的变化情况,不会显示工作区的变化。
git diff --cached # 已缓存
git diff HEAD # 查看已缓存的与未缓存的所有改动
# 5 比较工作区跟每次提交之间的所有的差别
git diff commitId
# 6 比较两个提交id之间的差异,相似功能:git log -p -n 1
git diff id1..id2 # 旧..新
查看commit
查看某次的commit或者几次的提交id
# 1. git log 查看提交历史
git log
git log --oneline # 单行显示
# 2. 查看某次提交的内容
git show commitId
# 3. 查看某次commit中具体某个文件的修改
git show commitId fileName
# 4. 查看最近几次提交的内容
# n为数字,表示最近n次的修改
git log -p -n 1
标签
https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE
创建标签:
git tag -a V1.2 -m 'version 1.2'
查看标签:
# 查看有多少标签
git tag
# 具体某个标签的信息
git show V1.2
tag远程推送
git push origin --tags
# 或者简单形式
git push --tags
删除标签
git tag -d V1.2
删除远程标签:
推送的空的同名版本到线上,达到删除线上版本的目标
git push origin :refs/tags/V1.2
获取远程版本:
git fetch origin tag V1.2
配置
仓库内./git/config文件对应--local参数,直接手改也行,范围,本git项目。当然,也能配置其他的,任意配置。
git config --global user.name xxxx # 或者email
定义别名
git config --golbal alias.st status
然后可以使用git st这样的别名来访问。
ctrl
git config --global core.autocrlf true # input/false
- true 自动完成标准化与转换
- input 只做标准化操作,不做转换操作
- false 提交与检出的代码都保持文件原有的换行符不变
子模块
grpc 克隆(depth=1) ,子模块升级。
export GRPC_RELEASE_TAG=v1.31.1
git clone --depth 1 -b ${GRPC_RELEASE_TAG} https://github.com/grpc/grpc grpc
cd grpc
git submodule update --init --recursive
回滚代码篇
代码回滚
在上传代码到远程仓库的时候,不免会出现问题,任何过程都有可能要回滚代码:
1、在工作区的代码
git checkout – a.txt # 丢弃某个文件,或者
git checkout – . # 丢弃全部
注意:git checkout – . 丢弃全部,也包括:新增的文件会被删除、删除的文件会恢复回来、修改的文件会回去。这几个前提都说的是,回到暂存区之前的样子。对之前保存在暂存区里的代码不会有任何影响。对commit提交到本地分支的代码就更没影响了。当然,如果你之前压根都没有暂存或commit,那就是回到你上次pull下来的样子了。
2、代码git add到缓存区,并未commit提交
git reset HEAD . 或者
git reset HEAD a.txt
这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化
3、git commit到本地分支、但没有git push到远程
git log # 得到你需要回退一次提交的commit id
git reset –hard
或者
git reset –hard HEAD^ # 回到最新的一次提交
或者
git reset HEAD^ # 此时代码保留,回到 git add 之前
4、git push把修改提交到远程仓库
1)通过git reset是直接删除指定的commit
git log # 得到你需要回退一次提交的commit id
git reset –hard
git push origin HEAD –force # 强制提交一次,之前错误的提交就从远程仓库删除
2)通过git revert是用一次新的commit来回滚之前的commit
git log # 得到你需要回退一次提交的commit id
git revert
3) git revert 和 git reset的区别
- git revert是用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留;
- git reset是回到某次提交,提交及之前的commit都会被保留,但是此commit id之后的修改都会被删除
ubuntu升级git
add-apt-repository ppa:git-core/ppa
apt-get update
apt-get install git
# 查看git版本
git --version
sha值查看文件名
查找sha与文件名的对应关系,并过滤出自己想要的。
原因:推送文件到gitee仓库,但是单个文件超过了100M,提示文件过大。所以出现如此提示,来查看对应的文件名。
git rev-list --objects --all |grep d09a
配置文件位置
vi ~/.gitconfig
git的全局配置,在这个里面也可以看到。
bare仓库
- 如何将一个bare仓库的代码,迁出来?
比如仓库名称:test.git
#重命名
mv test.git .git
# 取消bare仓库设置
git config --unset core.bare
#迁出代码
git checkout -b new
利用bare仓库,来进行代码共享
参见搭建Git服务器
其实非常简单,假设自己的linux账号为chaofml,为了简单起见,就直接用账号登录(虽然不安全)。
#当前路径 为 ~ 即 /home/chaofml
git init --bare mybare.git
然后,在其他主机上就可以用到这库呢。linux主机ip:10.20.23.154
git clone chaofml@10.20.23.154:/home/chaofml/mybare.git
#省略的形式
git clone chaofml@10.20.23.154:mybare.git
另外,如果是家目录,可省略。即/mybare.git 省略为mybare.git。
简单到没朋友。
https记住密码
# 设置记住密码(默认15分钟):
git config --global credential.helper cache
# 如果想自己设置时间,可以这样做:
git config credential.helper cache –timeout=3600
# 长期存储密码:
git config --global credential.helper store
# 重置账号密码
git config --system --unset credential.helper
执行完毕会在在当前系统用户文件夹下生成一个名为.git-credentials的文件,如:C:\Users\Administrator.git-credentials,再次提交代码时,输入密码后会将用户名密码以明文的方式保存在其中。
上面比较方便,也能手动去配置。如下:
# 新建保存密码的文件
vim ~/.git-credentials
# 添加下面内容
https://{username}:{passwd}@github.com
# 执行下面添加git配置
git config --global credential.helper store
# 查看~/.gitconfig文件变化
#~/.gitconfig文件多出下面配置项
[credential]
helper = store
备注:
ssh方式的免密登录,网上有很多。另外,win10系统会自动保存用户的密码,也非常的方便。
代理下载
参考:代理配置
本地有代理的话,临时使用代理。
git clone -c http.proxy='http://localhost:7890' https://github.com/twz915/zqxt.git
配置本仓库的代理:
git config http.proxy 'http://localhost:7890'
#使用git://协议
git config core.gitProxy 'socks5://127.0.0.1:1080'
参考
https://blog.csdn.net/asoar/article/details/84111841
同名文件
在linux开发,大概遇到了readme.md,README.md这样两个同名文件,在windows,总是会出现这样的问题。
解放方式:
- 先在gitlab,仓库页面,直接编辑,将其中一个文件名,更成其他的,避免重复。
- 在windows本地,先保存先有的更改代码,然后直接回滚代码
git reset,然后再重新拉取代码,更新,即可。
也或者在gitlab更改好名字后,再重新下载所有的代码。