git mise

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关联起来

  1. 先拉取
    git pull origin master # git pull <远程> <分支>
  2. 关联
    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的提交, 注: 真实生产环境慎用

  1. 修改了代码, 或要修改 log comment
  2. git add . # 暂存代码
  3. git commit --amend # 覆盖本地仓库的最后一次提交
  4. 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值