Git global setup
git config --global user.name "xxx"
git config --global user.email "[email protected]"
Create a new repository
git init
git remote add origin git地址
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
git remote -v / git remote show origin: 在本地查看git 仓库的远端信息:包括git 地址,仓库情况等
Git 重命名文件
Git mv file_from file_to
Git 日志
git log: 查看所有的commit记录,用Q退出
git log --oneline
git log -p (commitId): 显示内容差,类似于git show
git log -2: 显示最近两次的提交
git show commitId:显示某一次提交的详细信息
git diff 可以查看工作区的修改
git diff --cached 查看暂存区的改动
git reflog: 展示出之前所有的git 操作,可以用于在git reset --hard commitId以后查找出销掉的commitId,便于再次恢复,git delete分支后也可以用来恢复
git reflog show --date=iso: 显示具体提交日期
Git patch
git format-patch commitId:自某次commit以后的所有patch, 但不包括该次的commit
git format-patch -1 commitId:对应于某次commit的patch
合并patch:
在解决完冲突以后, 比如用git add来让git知道你已经解决完冲突了。
如果你发现这个冲突是无法解决的, 要撤销整个am的东西。 可以运行git am –abort,
如果你想只是忽略这一个patch,可以运行git am –skip来跳过这个patch.
Git stash
git stash:将当前工作区的更改进行保存,并且恢复到上一次提交的地方
git stash save "save message" : 执行存储时,添加备注,方便查找
git stash list: 列出缓存列表
git stash show( stash@{$num}): show最近一次(指定)存储
git stash apply(stash@{$num}):应用最近一次(指定)存储
git stash apply --index: 让工作区和暂存区的都和原来保持一致,否则全部回退的暂存区
git stash pop(stash@{$num}):取出并移除最近一次(指定)存储
git stash drop (stash@{$num}) 移除最近一次(指定)存储
git stash clear :删除所有缓存的stash
注:git stash pop和git stash apply的区别:
git stash pop 命令会在 stash 应用之后丢弃(默认情况下指的是最顶部的)stash,而 git stash apply 会将其保留在存储列表中,以备日后重用(或者您可以在之后使用 git stash drop 命令移除此 stash)。
除非 git stash pop 之后存在冲突,在这种情况下,它将不会删除该 stash,而使其行为与git stash apply 的命令完全相同。
Git 合并
- git merge
- git merge branch_to / 节点哈希值: merge branch_to 分支代码到当前分支
- 如果目标分支完全领先于当前分支,则简单合并,不会产生新的提交记录
- 如果两个分支都有改动,则根据时间顺序将两个分支的commit提交记录合并,根据两个分支的最新节点进行检测,如果有conflict,解决完冲突之后再产生一笔新的提交(可以自定义commit message),没有冲突也会产生一笔新的提交
- 如果解决完冲突之后当前分支没有额外提交代码,对应的commit记录还是会存在
- git diff查看冲突,在冲突文件上右击选择resolve conflict,手动解决完冲突后需要git commit
- gitk用图像显示commit历史。
- git merge --abort: 撤销git merge,恢复到git merge之前的状态, 只有在merge过程中撤销才会生效
- git rebase
- git rebase A:
-
- 在B分支上执行 git rebase A 后,将公共节点之后B上的提交都放在A最新提交节点的后面(生成新的提交记录,commit hash会变)
- Merge会产生一笔提交(commit),如果使用git rebase就不会看到这些提交记录, 需要注意的是conflict的地方上下展示和merge相反,上面的HEAD是目标分支代码,如果解决完冲突之后当前分支没有额外提交代码,则当前分支对应的commit 记录不会存在
- rebase不会按照时间排序提交记录,当前分支会排在目标分支后面
- git rebase --onto: 跳过中间某一分支的提交记录将两个分支合并
- git rebase --skip 则会将引起冲突的commits丢弃掉(慎用!!);
- git rebase --continue 在手动解决完冲突之后运行该命令不会产生额外的提交,
- git rebase --abort: 撤销git merge,恢复到git merge之前的状态,只有在merge过程中撤销才会生效
- git rebase -i :https://blog.csdn.net/FightFightFight/article/details/80850328
- git cherry-pick commitId: git reset --hard commitId以后如果还想将目前所在的commitId以后提交的的某一次commit记录加进来,就可以用这个命令
- 最佳实践
- 本地将目标分支rebase到开发分支,可以保证自己的提交记录一直在最后,然后所有的提交都可以通过git commit --amend --no-edit放在一个提交记录里面
- 远端merge的时候因为本地完全领先于远端,所以不会产生新的提交记录
Git 撤销
- git revert commitId: 撤销某次commit提交,并且产生一次新的提交
- git reset --hard commitId:回退到某次commit提交,commit之后的提交全部清除
- git reset HEAD~: 回退某次commit的提交内容到工作区
- git reset HEAD file:将文件由暂存区放回工作区,等价于git restore --staged file
- git checkout -- file: 撤销文件在工作区的更改
Git branch
- git clone
- git fetch, git fetch origin
- 查看分支信息
- git branch -a:查看所有分支,包括本地和远程,可以看见远端删除后的分支
- git remote show origin查看分支信息
- git remote prune origin: 删除本地分支存在但是远程分支已经不存在的分支, 前提是本地和远程分支有过关联
- git branch -r:只查看远程分支
- git branch:查看本地分支
- 创建分支
- git checkout -b branch:从当前分支创建一个新的分支,并且切换到该分支
- git checkout branch: 从 对应远端分支新建一个本地同名分支,并且切换到该分支
- 删除分支
- git branch -d branch(如果是D则为强制删除): 删除本地分支
- git push origin :branch: 删除远端分支
- git status
- 查看当前分支状态,git status -s 命令或 git status –short:更为紧凑的输出
- git add
- git add file: 这是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。
- git add . :将工作区的文件全部提交到暂存区
- git commit
- git commit -a -m: 合并git add和git commit 命令
- git commit -m 提交信息
- git commit –-amend:可以使用上一次提交的message信息,不增加额外的提交记录。
- git commit --amend --no-edit:省去中间编辑步骤
- git push
- git push origin HEAD:feature/My20_02:本地分支名和远端不一样
- git remote show origin:查看远程分支信息
- git pull
- 用git pull --rebase代替git pull,将本地未提交的commit放置在最后
修改.gitignore文件不生效
因为.gitignore只能忽略那些原来没有被track过的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。解决方法就是先把本地缓存删除(改变成未track状态),然后再提交。
git rm --cached --force file
注意:
- 在 git 中任何已提交的东西几乎总是可以恢复的。甚至那些被删除的分支中的提交或使用 --amend选项覆盖的提交也可以恢复。然而,任何你未提交的东西丢失后很可能再也找不到了。
- 当一个文件在处于工作区或者暂存区时,它可以在所有分支间共享,但是一旦被commit,就不能再被其他分支共享,切换到其他分支时就没有相应的改动了,在push之前对该文件所做的更改都只能在该分支完成。如果远端或者本地两个分支的同一文件不一样,则不能相互切换,需要用到git stash.
- 如果不小心commit或者是push了错误的文件,则只需要将正确的再次commit或者push, 会自动merge.