git是工作中经常用到的版本控制管理工具,经常和svn进行对比,他们之间的优缺点就不说了,下面是一些常用的git命令,记录下来方便快速使用。
克隆项目 (xxxx.git是项目git文件,abc是本地储存的别名,默认xxx)
git clone https://github.com/brisklan/xxx.git abc
查看所有分支(会列出本地和远程的所有分支,不加-a仅列出本地分支)
git branch -a
显示所有分支并显示创建人
git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -k5n -k2M -k3n -k4n
本地创建分支(newBranchName是新分支名称,baseBranchName基于次分支创建,是可选的)
git branch newBranchName [baseBranchName] #比如基于远程的develop创建本地dev分支 git branch dev origin/develop
切换分支(itemBranchName是要切换到的分支名称)
git checkout itemBranchName
创建并切换分支(其实是将上面的两步合并操作,baseBranchName基于次分支创建,是可选的)
git checkout -b newBranchName [baseBranchName]
将本地分支推送到远程并在远程创建dev3分支(dev1是本地分支,dev3是远程分支)
git push origin dev1:dev3
本地分支的修改推送到远程分支(branchName是远程分支名称)
git push origin branchName
删除本地分支(删除名为branchName的分支,注意要先切换到其它分支再操作)
git branch -d branchName
删除远程仓库分支(删除名为branchName的分支,谨慎点)
git push origin --delete branchName
!如果删除远程失败(但git branch -a又看到)提示:error: unable to delete 'xxxxx': remote ref does not exist
需要更新本地的镜像(清除远程分支的本地缓存):
git fetch -p origin
拉取远程分支到本地分支合并
git pull origin abc(远程分支名称)
#获取远程master的分支的代码到临时新建的temp git fetch origin master:temp
合并分支(将A分支合并到B,先切换到B分支,然后合并)
#切换到B分支 git checkout B #先拉取B的最新状态 git pull #合并A到B git merge A -m "A和并到B分支,其它说明" #提交到远程(有必要的话) git push
合并某些指定文件:
要将dev分支中的特定文件合并到master分支,你可以按照以下步骤操作:
1. 确保你当前位于master分支。如果不是,请切换到master分支:
git checkout master
2. 使用以下命令将dev分支中的指定文件合并到master分支:
git checkout dev -- path/to/file
其中, `path/to/file` 是你想要合并的文件的路径。
如果要在master合并dev分支的某个commit(自己查询commit的hash)
git cherry-pick <commit-hash> #然后添加到自己的版本 git add .
3. 提交合并的更改到master分支:
git commit -m "Merge specified file from dev branch"
3的补充,如果提交的信息错误,可以矫正(输入下面的命令后可以通过vi命令修改提交的备注,然后保存即可):
git commit --amend
修改文件暂存
#给fileName暂存 git add fileName #暂存所有修改 git add -A #某目录下所有 git add dirName/*
提交版本
git commit -m "这是提交的说明"
查看当前状态(可以查看已经add的、修改的、新增的)
git status
未提交的修改暂缓(处理冲突、多分支使用等有奇效)
git stash
查看暂缓的修改
git stash list
将暂缓的弹出(主要和apply的区别是,pop会取出暂缓数据,而apply仅复制,也就是前者用一次,后者可多次用,一般都是用pop,多个分支使用已暂缓的记录时用apply【最后可以用git stash clear清理】)
git stash pop
拉取远程分支某个commit(回滚到某个commit)
git reset --hard <commit_num> 本地切换到要回滚的分支,之后: git reset --hard f7f4ecb2b2 再强制回滚远程的分支: git push origin HEAD --force
两个覆盖:
git reset --hard origin/<branch_name> #远程覆盖本地 git push origin <branch_name> --force #本地覆盖远程
git reset 的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本。适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。
git revert 和 git reset的区别
- git revert是用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留;
- git reset是回到某次提交,提交及之前的commit都会被保留,但是此commit id之后的修改都会被删除.
处理冲突(特殊冲突手动修改代码处理):
查看某个人的所有提交
git log --author="author"
查询某个人并且按提交信息去重,并显示日期的方式(总结的时候常用):
git log --author=wei --format="%cd %s" --date=short | awk '!seen[$0]++'
上面的命令可以查查某天(记得在git bash命令下执行):
git log --author=wei --format="%cd %s" --date=short | awk '!seen[$0]++ && $1 == "2023-12-11"'
在修改一下,支持时间范围:
git log --author=wei --format="%cd %s" --date=short | awk '!seen[$0]++ && $1 >= "2023-11-12" && $1 <= "2023-12-12"'
查看提交日志
git log --oneline --graph --decorate --all --oneline 日志单行显示 --graph 分支图显示 --decorate 可显示分支名称 --all 显示所有分支
这里的选项解释如下:
--name-only: 只显示每个提交中修改的文件名。
--pretty=format:: 隐藏提交信息,只显示文件名。
--since="3.days.ago": 限制日志到最近三天的提交。
如果你还希望看到每个文件的修改状态(如 A 表示新增,M 表示修改,D 表示删除等),可以使用 --name-status 选项替换 --name-only:
git log --name-status --pretty=format: --since="3.days.ago"
查看某个文件的历史记录:
git blame filename
还可以用-L指定行数范围(第n1到n2行):
git blame -L n1,n2 filename
git trash 相关说明
1 当正在dev分支上开发某个项目,这时项目中出现一个bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然后顺利切换到hotfix分支进行bug修复,修复完成后,再次切回到dev分支,从堆栈中恢复刚刚保存的内容。
2 由于疏忽,本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发,可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可。
总的来说,git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。这也就是说,stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。
git stash pop
将当前stash中的内容弹出,并应用到当前分支对应的工作目录上。
注:该命令将堆栈中最近保存的内容删除(栈是先进后出)
git stash apply
将堆栈中的内容应用到当前目录,不同于git stash pop,该命令不会将内容从堆栈中删除,也就说该命令能够将堆栈的内容多次应用到工作目录中,适应于多个分支的情况。
git stash clear
清除堆栈中的所有 内容
如果环境改动很多,某些开发到一半想要把某些独立分支(不是全部修改):
直接基于开发中的分支新建一个分支(git checkout -b newBranch(新分支) nowBranch(当前开发一半分支)),然后在新的分支提交独立的修改即可,独立的修改将保留在独立的新分支。
撤销某个文件的修改(没有add时)
git checkout -- abc.text(文件名称)
移除版本控制(已经添加过版本的,直接在忽略添加无效的),然后commit提交一下
git rm --cache filename(文件名称)
标签
#创建本地tag标签(基于最新提交commitId)
git tag <tagName>
#基于某个commitId创建
git tag -a <tagName> <commitId>
#备注
git tag -a 标签名称 提交版本号 -m 附注信息
#将tagName标签推送到远程仓库origin
git push origin <tagName>
#还支持一次推送本地所有标签
git push origin --tags
#查看某个标签信息
git show <tagName>
在提交历史中查看标签
git log --oneline --graph
#删除本地某个标签
git tag -d <tagName>
#删除远程仓库某个标签
git push origin :refs/tags/<tagName>
也可以
git push origin --delete <tagName>
git命令在线工具,可以帮你直接生成命令:https://gitexplorer.com/