git操作

| 分类 git  | 标签 git操作  浏览次数: -

安装git

  • Ubuntu
sudo apt-get install git

每个仓库的Git配置文件都放在.git/config文件中.

当前用户的Git配置文件放在用户主目录下的隐藏文件.gitconfig中.

专有名词

  • 工作区:当前修改的未git add的文件
  • 暂存区:修改后git add操作的文件
  • 版本库: 执行git commit,把暂存区文件提交到仓库

centos升级git

git clone https://github.com/iuscommunity/automation-examples
cd automation-examples/
git checkout bash
sudo ./enable-ius.sh
sudo yum swap git git2u  # If CentOS6: sudo yum install -y yum-plugin-replace && sudo yum replace git --replace-with git2u

git常用设置

1.设置颜色

git config --global color.ui true

2.设置别名

git config --global alias.st status # git status 用 git st替换

3.设置用户名、邮箱

git config --global user.name "huangjiandong"
git config --global user.email 1131909224@qq.com

4.设置忽略文件

touch .gitignore # 被.gitignore忽略的文件可以用 `git add -f` 文件名强制添加
git check-ignore -v .gitignore # 检查规则是否写错

5.查看配置

git config -l

从上游分支拉取更新

fork分支项目,从master上更新,提交到自己分支,再到后台进行合并

  • 1.把项目从git上迁下,可以直接在pycharm中操作,之后的命令再用命令行
  • 2.同步主线的代码到本地
git remote add upstream http://x.x.x.x:82/napa_dev/api.git
  • 3.从上游仓库获取到分支,及相关的提交信息,它们将被保存在本地的 upstream/master 分支
git fetch upstream
  • 4.切换到本地的 master 分支
git checkout master
  • 5.把 upstream/master 分支合并到本地的 master 分支,本地的 master 分支便跟上游仓库保持同步了,并且没丢你本地的修改(此时可能会有一些代码的冲突)
git merge upstream/master
  • 6.pull时选择从upstream更新即可
  • 7.修改后commit到本地仓库并且push到自己的分支,如果检查没有问题时就可以在git后台添加合并代码请求,将代码合并到上游仓库中

github上新建了一个仓库,把代码提交到github上

1.本地初始化空的仓库

git init

2.添加所有项目文件到本地仓库

git add .  # . 代表把当前目录下所有文件添加到仓库

3.提交文件到本地仓库

git commit -m "提交注释"

4.本地生成ssh密钥,并添加到github上,不然无法把项目推送到github

① 终端执行:ssh-keygen -t rsa -C "邮箱地址"

② 把 ~/.ssh/id_rsa.pub 里的内容放到github, SSH KEY

5.推送本地项目到远程仓库

git push -u origin 分支名 # 第一次提交,所以加上-u参数,`-u`:指定上游仓库,因为原本中github上,仓库为空

git push -u origin gaga 相当于 git push origin gaga + git branch --set-upstream-to=origin/gaga master

把远程项目克隆到本地进行修改,提交本地,提交远程仓库

1.克隆项目到本地

git clone xxxx.git # 默认主机名是origin

git clone -o 远程主机名 xxxx.git # 克隆时设置远程主机名

2.修改文件前更新远程仓库,防止与他人冲突

  • git fetch 进行更新
git fetch <远程主机名> # 获取远程主机的更新到本地
git fetch <远程主机名> <分支名> # 获取远程主机某个分支的更新到本地

取回的更新在本地要用 <主机名>/<分支名> 的形式读取

git merge abc #合并abc分支到当前分支
  • git pull 进行更新
git pull (远程主机名) (远程分支名):(本地分支名) # 远程分支是与当前分支合并,则冒号后面的部分可以省略
git pull -p # 加上参数 `-p` 就会在本地删除远程已经删除的分支

git pull = git fetch + get merge

在实际使用中,git fetch更安全一些因为在merge前,我们可以查看更新情况,然后再决定是否合并.

3.进行文件修改操作

4.查看当前仓库状态

git status # 查看哪些文件修改了但是没有提交
git diff test.py # 查看test.py文件更改内容

5.把文件添加仓库

git add test1.py test2.py test3.py # 添加3个test.py到仓库
git add .  # `.` 代表把当前目录下所有文件添加到仓库

6.提交文件到本地仓库

git commit -m "提交注释"

7.提交代码到远程仓库

git push origin <分支名>

git push --force # 强制提交

修改文件后,想要丢弃修改

  • HEAD:当前版本
  • HEAD^ :上一个版本
  • HEAD^^ :上上一个版本
  • HEAD~100:上100个版本
git reset HEAD^ # 保留修改的文件。只是清除commit信息

git reset --hard HEAD^ # 清除源码和commit信息

git reset --hard 版本号 # 版本号不用写全,可以回到未来、过去版本
  • 暂存区的修改撤销掉,重新返回工作区
git reset HEAD test.py
  • 丢弃工作区修改,把test.py文件在工作区的修改全部撤销(即还原到最新的版本)
git checkout -- test.py

①自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

②已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态

  • 恢复某个指定文件到指定版本
git checkout 版本号 test.py # 恢复test.py文件到指定的版本
  • reset
git reset –mixed # 此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息

git reset –soft # 回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可

git reset –hard # 彻底回退到某个版本,本地的源码也会变为上一个版本的内容

分支提交到仓库,想修改commit注释

  • 未push到远程分支

1.修改最后一次commit注释

git commit --amend # 在编辑页面直接修改注释即可

2.修改非最后一次commit注释

git rebase -i HEAD~3 # 表示要修改当前版本的倒数第三次状态把要修改的注释那行的`pick`改成`edit`,然后保存退出

git log # 查看刚刚发现修改的注释变成了最后一次commit

git commit --amend # 在编辑页面直接修改注释即可

git rebase --continue # 还原commit顺序

远程仓库操作

git remote show <主机名># 查看主机的详细信息

git remote add <主机名> <网址>#添加远程主机

git remote rm <主机名>#删除远程主机

git remote # 查看远程库的信息

git remote -v #显示更详细的信息

git remote prune origin  # 更新远程仓库分支信息

关于git查询信息(tig:git查询工具)

  • 显示出来的节点顺序,不是绝对按时间顺序排列的
git log # 查看提交(commit)记录

git log --pretty=oneline # 显示更简单信息

git log --oneline # 一个提交记录只显示一行

git log -p test.py # 查看test.py的详细提交记录,曾经都修改过哪些地方

git show commit_id <文件名> # 显示具体的某次改动的修改

git log  --author="username" # 只查看某人的提交记录

git blame <文件名> # 查看文件每一行的改动详细信息,包括时间,作者,commit id

tag操作

常用于发布一个版本时,先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。

git tag tag名 # 打新标签
git tag # 查看所有标签,按字母排序
git tag tag名 commit_id # 对某个历史提交打tag
git tag -a tag名 -m "文字说明" commit_id # 增加文字说明
git show tag名 # 查看文字说明
git tag -s tag名 -m "文字说明" commit_id # 用私钥签名一个标签,签名采用PGP,必须先安装gpg(GnuPG)
git tag -d tag名 # 删除tag
git push origin tag名 # 提交标签到远程
git push origin --tags #一次性推送全部尚未推送到远程的本地标签
git push origin --delete tag <tagname> # 从远程删除tag
  • 已经push到远程分支

使用 git-up 软件进行修改

分支的创建、查看、切换、合并、删除

  • 1.创建
git branch 分支名 # 创建新的分支

git checkout -b 分支名 # 创建并切换到新的分支
  • 2.查看
git branch # 查看当前所在分支
  • 3.切换
git checkout 分支名 # 切换分支
  • 4.合并

  • 当前分支情况

当前分支情况

git merge experiment # 合并experiment分支到当前分支(master)

merge分支后

marge

  • 特点: 自动创建一个新的commit,如果合并的时候遇到冲突,仅需要修改后重新commit
  • 优点: 记录了真实的commit情况,包括每个分支的详情
  • 缺点: 因为每次merge会自动产生一个merge commit,所以在使用一些git 的GUI tools,特别是commit比较频繁时,看到分支很杂乱。

rebase

git rebase master # 合并master分支到当前分支(experiment)

rebase操作之后

  • 特点: 会合并之前的commit历史
  • 优点:得到更简洁的项目历史,去掉了merge commit
  • 缺点:如果合并出现代码问题不容易定位
git log --graph --pretty=oneline --abbrev-commit # 查看分支合并情况
  • 分支合并模式

Fast forward: 删除分支后会丢掉分支信息

  • 禁用Fast forward
git merge --no-ff -m "禁用后会创建一个新的commit" 分支
  • 5.删除
git push origin --delete 分支名 # 删除远程分支

git branch -d 分支名 # 删除本地分支

git branch -D 分支名 # 删除未合并过的分支,即创建修改之后,想进行删除(强行删除)

暂存工作区内容,不添加仓库

git stash # 可多次执行

git stash list # 查看暂存的列表

git stash apply # 恢复暂存内容,但是stash内容并不会删除,需要使用git stash drop进行删除

git stash pop # 恢复暂存区内容并删除stash
  • 多个stash恢复
git stash apply stash@{0} # stash@{0}是通过git stash list查到的

对比两次commit改动文件

git diff HEAD HEAD^ --stat # 展示格式是文件内容修改

git diff HEAD^ HEAD --name-status  # 展示格式是文件名和状态

git diff-tree -r --name-only upstream/master HEAD  # 只展示文件名

HEAD和HEAD^可以换成两次提交的版本号或者tag

github相关

  • 1.从github上迁下项目
  • 2.ssh-keygen -t rsa -b 4096 -C "1131909224@qq.com" 生成SSH key,把home目录下的.SSH文件夹中的id_rsa.pub复制到gihub上。在 setting -> SSH and GPG keys
  • 3.eval "$(ssh-agent -s)",启动ssh代理
  • 4.ssh-add ~/.ssh/id_rsa,添加到 GitHub 帐户的 SSH 密钥

merge单个commit到当前分支

git cherry-pick <commit id>

克隆指定分支

git clone -b v2.7.10 --depth=1 git://github.com/ansible/ansible.git --recursive

合并多个commit

git rebase -i HEAD~<N>

Pycharm设置git

Windows

Windows在Pycharm中配置Git

Ubuntu

Ubuntu在Pycharm中配置Git

统计代码

  • 统计指定用户代码提交行数
git log --author="$(git config --get user.name)" --pretty=tformat: --numstat | awk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }'
  • 统计指定用户提交commit次数
git log --author="$(git config --get user.name)" --oneline | wc -l

修改历史提交用户名

  • 1.克隆代码
export GITHUB_USER=seekplum
export REPO_NAME=web-learn.git
git clone --bare git@github.com:${GITHUB_USER}/${REPO_NAME}
  • 2.记录旧邮箱,新用户邮箱
export OLD_EMAIL=huangjiandong@meideng.net
export CORRECT_NAME=seekplum
export CORRECT_EMAIL=1131909224@qq.com
  • 3.在仓库中执行脚本
cat > change_github_user.sh<<EOF
#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="${OLD_EMAIL}"
CORRECT_NAME="${CORRECT_NAME}"
CORRECT_EMAIL="${CORRECT_EMAIL}"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
EOF
  • 4.检查提交历史是否已经修改
  • 5.push修改到github中
git push --force --tags origin 'refs/heads/*'
  • 6.清除克隆的临时目录

查看操作历史

git reflog

永久删除文件

  • 1.删除指定文件
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch linux-tools/settings.jar' --prune-empty --tag-name-filter cat -- --all
  • 2.推送修改到远程仓库
git push origin master --force --all
git push origin master --force --tags
  • 3.清理和回收空间
trash .git/refs/original/

git reflog expire --expire=now --all

git gc --prune=now

git gc --aggressive --prune=now

只忽略本地仓库文件

# 按照 .gitignore 的格式填写即可
vi .git/info/exclude

上一篇 Centos换源     下一篇 《鸟哥的 Linux 私房菜》
目录导航