git init
在当前目录初始化一个git repo
注: 这种方式初始化的目录与git clone的有区别, 后期需要执行 git remote add origin 远程url 的方式设定一个 remote, 才能推送,
并且推送在推送前需要拉去一遍远程目录, 并且还会报错: fatal: refusing to merge unrelated histories // 拒绝合并无关历史, 需要执行git pull origin master --allow-unrelated-histories 忽略掉无关历史,强制拉去后, 才能推送成功
要将当前repo与远程repo关联起来
- 先拉取
git pull origin master # git pull <远程> <分支> - 关联
git branch --set-upstream-to=origin/master
git status
git status -s #简短信息
可以查看当前工作目录的文件状态
git add [filename]
git add . #所有文件
添加工作区中的文件到暂存区, 我理解实际上是标记了一下文件而已
另外: 如果文件在工作区中发生了修改, 同样需要先执行 git add 将修改提交到暂存区中, 然后才能commit到本地repo, 也可以在commit时使用 -a 选项自动添加修改的文件(但新建文件第一次还是需要先add的)
git rm [filename]
在暂存区中标记文件被删除
注: 该命令要成功, 要求 删除的文件 在工作区中没有修改过, 并且 在暂存区中也没有任何标记, 否则会提示: 文件已经修改, 或提示: 索引有变更(即:暂存区中有了标记,如:修改等), 可以使用 -f 选项强制标记删除(同时也从工作区中删除了), 如果想保留工作区中的文件(即 只删除暂存区中的文件, 可以使用 --cached)
git rm --cached [filename]
从暂存区中删除文件, 即取消标记, 可以从暂存区中删除之前add的文件, 本地文件将保留
git mv
重命名
git reset HEAD
git reset [分支名] #git reset master
根据 HEAD 或 分支名 重置掉 暂存区, 即之前add的文件又从暂存区中删除了
git reset -hard HEAD~0
重置掉工作区的代码, 回退到 HEAD 之前 0 个位置
git commit -m “[提交注释]”
将暂存区中的文件提交到本地repo
git commit -am “[提交注释]”
讲暂存区以及工作目录中修改的文件都提交到本地repo
git config --global --list
列出所有全局配置
git config --global user.name [用户名]
git config --global user.email [邮箱]
设置全局用户名,邮箱
git config --local --list
列出所有当前repo的配置
git diff
工作区与暂存区比较
git diff --stat #
查看 工作区 与 暂存区的 diff
git diff --cached
查看 暂存区 与 本地repo的diff
git branch 查看分支
git branch -a 查看所有分支
git branch [分支名称] 创建分支
git checkout [分支名称] 切换分支 # 如果有同名的远程分支, 将创建一个同名的本地分支, 并关联到远程分支
git branch -d [分支名称] 删除分支
git merge [分支名称] 将指定分支合并到当前分支
git branch -vv 可查看本地分支与远程分支的关联
git branch -r 查看远程分支
git checkout -b [分支名称] 创建并切换分支
注 -b:该命令是基于当前分支创建一个本地分支,并没有与远程分支创建关联
git checkout [分支名称] 切换分支
注:该命令是切换分支,如果该分支名称在本地有,直接切换,如果远程有,即在本地创建该分支并关联远程,如果本地、远程都没有,就切换失败
git log
git log --oneline
git log --oneline --graph
日志
git reflog
日志,并显示HEAD的相对步数(即 移动到某个版本需要的偏移)
关于 github ssh 免密提交
windows账户似乎不用每次都输入github的账号密码,是因为浏览器有记录
如果要免密, 就需要使用ssh, 配套的ssh的git地址 如:git@github.com:ifelixking/gittest1.git
cd 到 ~
执行: ssh-keygen -t rsa -C 邮箱
拷贝 ~/.ssh/id_rsa.pub 内容到 github的Personal settings/SSH and GPG keys中
git commit --amend
修改之前的提交
测试发现, 该命令可用于修改最后一次的提交, 包括最后一次提交的内容和注释
但如果已经讲内容推送到了远程, 则无法修改, 如果强行操作, 就会产生一个冲突, 因为–amend的本质是回退了本地版本的
该操作后, 从log中开不出改动, 但使用reflog则能查出amend
关于 refs/for
这个不是git的规则,而是gerrit的规则, 用于在线的code review, 推送的提交不会立刻合并到目标分支, 而是到了 refs/for/分支名称, 然后人工在线操作合并后, 才能合并到目标分支, 例如: 开发分支是 felixking/featureA, 如果使用 git push origin HEAD:felixking/featureA 则会直接合并到远程的 felixking/featureA 分支中, 如果远程库有限制, 则该操作会失败, 需git checkout -b要走code review 在线合并, 使用 git push origin HEAD:refs/for/felixking/featureA 命令, 这时会产生一个在线评审, 人工评审后, 在线点击合并才能最终合并到 felixking/featureA分支中, 注:由于是在线远程的合并, 合并后, 本地并不知道目标分支的最新状态, 执行 git status 后仍然会提示 本地分支领先于远程, 可以执行 git fetch获取一把远程信息(更新./.git), 就可以看到远程于本地同步的状态了
另外: 可以使用 git commit --amend 修改(应该说是追加, 最终还是一个change)已经push的change, 流程记录:
git checkout featureA
[coding…]
git add [files]
git commit -m"ok了"
git push origin HEAD:refs/log/feature
[wait for code review but 发现有问题]
[coding…]
git add [files]
git commit -amend #可以补充信息 “真的Ok了”
git push origin HEAD:refs/for/feature
[code reviewing and merge online]
git fetch # 同步远程状态
git rebase [分支名称]
用于重置当前分支的base, 具体的, 首先会将指定分支(remote)的代码合并到当前分支, 大部分情况会有冲突, 这时需要解决冲突, 重新 git add 这些文件, 然后再commit, 这时不会出现分叉(某些代码仓库要求不能提交有分叉的代码, 使用rebase能保证绝对的串行), 最后在push
注: 如果在提交代码前, 执行了 git pull (注: git pull 等于 git fetch + git merge) 不论有没有冲突, 只要是合并了, 就会产生分叉
总结每次提交的动作
git commit # 提交修改到本地仓库
git fetch # 将本地仓库与远程仓库同步
git status # 检查本地当前分支 与 远程 的领先情况, 如果本地领先, 直接 push 就行
git rebase # 如果本地落后(可以看到提示 本地分支与remote的分支出现偏离), 就需要rebase 一把, 即相当于 我的代码是 基于最新的 远程分支代码 编写的, 当然 这里很可能会出现冲突
[resolve conflicts]
git add # 将修改放入暂存区, 注: 这里不要执行 git commit, 后面的 rebase --continue 会做提交动作
git rebase --continue # 关键点: 使rebase动作继续, 直到结束rebase状态
git fetch / git status # 再次检查 分支领先情况, 如果点子背(又有人推了新代码) 就需要 再次 rebase
git push # 如果发现已经领先与 remote, 就能执行推送了
再者应用:
每次都需要基于某个分支签出新的分支做功能, 如基于mary/dev签出liyh/mary/dev, 但基于mary/dev开发时, liyh/mary/dev 已经落后好多了,
一种办法是在基于 mary/dev 签一个分支开发
另一种更好的做法是 在 liyh/mary/dev 上 rebase 一把 mary/dev
git checkout liyh/mary/dev
git rebase mary/dev # 该操作会将 mary/dev 的commit都合到 当前分支
这时 git 会提示 需要 git pull 操作, 如果执行 会产生分支, 但加上 --rebase 参数就不会
git pull --rebase # 强制不产生分叉
git push # 最后需要将合好的 分支 liyh/mary/dev 推到 remote
修改最后一次push的提交, 注: 真实生产环境慎用
- 修改了代码, 或要修改 log comment
- git add . # 暂存代码
- git commit --amend # 覆盖本地仓库的最后一次提交
- git push -f # 强制提交, 这个强制提交很危险, 会强制讲远程代码的HEAD置为提交的commit号, 中间如果也有提交, 将都会丢失
git commit 后 但是没有 push 到远程,如果要 撤销刚刚的 commit的话
git reset HEAD^
多目录命令
#!/bin/bash
function getshellwidth() # 这里可以去掉function
{
echo `stty size|awk '{print $2}'`
}
shellwidth=`getshellwidth`
printLine()
{
# 进行判断
if [ ! $1 ]; then
# 没有参数则直接输出 -
outword='-'
else
# 将输入的参数1 赋值给outword
outword=$1
fi
shellwidth=`stty size|awk '{print $2}'`
yes $outword | sed $shellwidth'q' | tr -d '\n'
}
for file in `ls .`
do
if [ -d "./"$file ]
then
cd $file
if [ -d ".git" ]
then
echo "[" $file "]"
echo $@
$@
printLine "="
echo
echo
fi
cd ..
fi
done
重命名分支
1、本地分支重命名
git branch -m oldName newName
2、将重命名后的分支推送到远程
git push origin newName
3、删除远程的旧分支
git push --delete origin oldName
显示如下,说明删除成功
To http://11.11.11.11/demo/demo.git
- [deleted] oleName
添加子模块
main-module/
git submodule add https://github.com/bitmingw/sub-module.git
git commit -m “add submodule version 1.0”
删除某个目录下 “未跟踪” 的文件
git clean ./ -f
解决 Windows git bash 运行慢的问题
原因是 bash 每次都要获取当前分支名称, 用于显示在命令提示符前, 所以每次回车都比较慢
解决方法, 注释掉 /etc/profile.d/git-prompt.sh 文件的 如下 代码
注意: 修改该文件 需要用管理员方式启动 git-bash
PS1='' # set window title
# PS1="$PS1"'\n' # new line
# PS1="$PS1"'\[\033[35m\]' # change to purple
# PS1="$PS1"'\[\033[33m\]' # change to brownish yellow
PS1="$PS1"'\[\033[34m\]' # change to brownish blue
PS1="$PS1"'\w' # current working directory
### 下边是展示分支的逻辑,执行需 2s 时长
#if test -z "$WINELOADERNOEXEC"
#then
# GIT_EXEC_PATH="$(git --exec-path 2>/dev/null)"
# COMPLETION_PATH="${GIT_EXEC_PATH%/libexec/git-core}"
# COMPLETION_PATH="$COMPLETION_PATH/share/git/completion"
# if test -f "$COMPLETION_PATH/git-prompt.sh"
# then
# . "$COMPLETION_PATH/git-prompt.sh"
# PS1="$PS1"'\[\033[36m\]' # change color to cyan
# PS1="$PS1"'`__git_ps1`' # bash function
# fi
#fi
PS1="$PS1"'\[\033[32m\]' # change to green
PS1="$PS1"':) ' # prompt: always $
PS1="$PS1"'\[\033[0m\]' # change color
参考链接: https://www.jianshu.com/p/0f91123642e3
git clone 出现 Smudge error: Error downloading … 错误
解决方法:
先执行
git lfs install --skip-smudge
然后再重新 clone 仓库
git add 添加所有 修改的和删除的文件 而忽略 未跟踪的文件
git add -u .
创建 tag 并推送到远程
列出所有tag
git tag
基于某个提交新建一个 tag
git tag < 标签名称 > < Commit ID >
推送本地所有标签到远程
git push origin --tags
更新子模块
git submodule update --init --recursive
查看某人提交的所有文件
git log --author=“username” --stat
删除 所有 untracked 文件
git clean -nxfd
恢复所有 submodule 的修改
git submodule update --init
修改历史 commit
https://blog.csdn.net/qq_17011423/article/details/104648075