安装git
- Ubuntu
sudo apt-get install git
- Windows:国外镜像,或者直接搜索
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)
marge
- 特点: 自动创建一个新的commit,如果合并的时候遇到冲突,仅需要修改后重新commit
- 优点: 记录了真实的commit情况,包括每个分支的详情
- 缺点: 因为每次merge会自动产生一个merge commit,所以在使用一些git 的GUI tools,特别是commit比较频繁时,看到分支很杂乱。
rebase
git rebase master # 合并master分支到当前分支(experiment)
- 特点: 会合并之前的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
Ubuntu
统计代码
- 统计指定用户代码提交行数
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