git操作

操作

git操作

手册地址

git操作文档
vim中如何全选复制

入门

在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 :<branch/tagname> 删除远程分支或标签
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

参考1 参考2

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

其实非常简单,假设自己的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更改好名字后,再重新下载所有的代码。