常用命令
配置
配置用户名和邮箱
#查看配置
git config user.name
git config user.email
#临时修改当前仓库的提交者信息
git config user.name "username"
git config user.email "email"
#全局修改用户名和邮箱
git config --global user.name "username"
git config --global user.email "email"
项目初始化与克隆
项目初始化
git init #当前目录创建空仓库
git init project-name #新建目录,将其初始化为Git仓库
项目克隆
git clone <url>
例子
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://git.url/path.git
git push -u origin master
分支管理
创建/切换分支
git branch <name> #创建新分支
git checkout <name> / git switch <name> #切换分支
git checkout -b <name> #创建并切换分支
分支操作
git branch #列出本地分支
git branch -r #列出远程分支
git branch -a #查看本地和远程分支
git pull origin branch-name #拉取远程分支
git merge branch-name #合并分支
git push origin branch-name #推送分支
git push --set-upstream origin branch-name #首次推送分支并关联远程分支
git branch -m new_branch #重命名当前分支
git branch -m old_branch new_branch #重命名指定分支
git branch -d <name> #删除本地分支,只适用于已合并的分支
git branch -D <name> #强制删除本地分支,未合并的也会被删除
git push origin --delete <name> #删除远程分支
远程分支
git remote -v #查看当前远程仓库地址
git remote add <name> <url> #添加或替换其它远程仓库地址
git remote remove <name> #删除远程仓库地址
git push origin --delete <name> #删除远程分支
git branch -r -d origin/branch-name #删除远程分支(可能有问题)
修改远程url
方式一:修改命令
git remote set-url origin https://git.url/path.git
git branch --set-upstream-to=origin/remote_name local_name
方式二:先删后加
git remote rm origin
git remote add origin [url]
git push --set-upstream origin master
方式三:直接修改config文件
SVN和git同时存在处理
svn checkout新目录
git clone --no-checkout gitpath tmp
mv tmp/.git .
rmdir tmp
git reset --hard HEAD
本地仓库同步远程仓库最新状态
git fetch --prune
.gitignore
语法规则
.gitignore文件中的每一行表示一个忽略规则
忽略指定文件或目录
myfile.txt #忽略某个文件
mydir/ #忽略某个目录及其所有内容
忽略某种类型的文件
*.txt #忽略所有.txt文件
使用!例外规则
logs/*.txt
!logs/important.txt #忽略所有.txt文件,但保留important.txt
使用/指定目录
/node_modules/ #/表示相对 .gitignore 文件所在的目录
node_modules/ #不使用/,则匹配所有层级的node_modules目录
使用**进行递归匹配
**/temp/ #忽略所有temp/目录,不管它在哪个层级
**/*.log #忽略所有.log文件,不管在哪个子目录
生效规则
已经被git跟踪的文件不会被.gitignore规则影响
解决方案:需先将它从git追踪中移除
git rm -r -n --cached "bin/" #-n:加上这个参数,执行命令时,是不会删除任何文件,而是展示此命令要删除的文件列表预览。
git rm -r --cached <file_or_dir>
git commit -m "Remove <file_or_dir> from tracking"
git push origin <branch>
检查某个文件是否被忽略
git check-ignore -v <file>
暂存stash
git stash
这个命令会将当前工作目录和暂存区的更改(包括已暂存和未暂存的更改)保存到一个临时的堆栈中,并恢复工作区到最近一次提交的状态。
未跟踪文件:git stash 默认只会保存已跟踪的文件的修改,不会保存新创建的未跟踪文件。如果你希望同时保存未跟踪文件,可以使用 git stash -u 命令。 添加注释:git stash save "message" 可以为 stash 添加一个注释,方便以后查找。
git stash list
这个命令会列出当前保存的 stash 列表。
git stash show
这个命令会显示最近一次保存的 stash 的详细信息,包括修改的文件列表。
git stash show stash@{0} #使用stash@{n}来查看特定的stash 的详细信息
git stash show -p stash@{0} #查看更详细的修改内容
git stash apply
这个命令会将最近一次保存的 stash 应用到当前工作目录。应用时,stash并不会被删除,你可以再次应用它。
git stash pop
类似于git stash apply,但会在应用后删除stash。
git stash drop stash@{n}
删除指定的stash
git stash clear
删除所有stash
回滚版本 reset
丢弃已暂存的修改
如果你已经执行了git add命令,但还没有执行git commit命令,那么你可以使用git reset命令来丢弃已暂存的修改。
git reset HEAD <file> #丢弃已暂存的修改
git reset HEAD #丢弃所有已暂存的修改
丢弃工作区的修改
在执行完 git reset HEAD 命令后,你可以使用 git checkout 命令来丢弃工作区的修改。
git checkout -- <file> #丢弃某文件的修改
git checkout -- . #丢弃所有文件的修改
同时丢弃已暂存的修改和工作区的修改
git reset --hard HEAD #丢弃已暂存的修改和工作区的修改
取消最近的commit(保留文件变更)--软回滚版本(soft)
git reset --soft HEAD~1
取消最近的commit(不保留文件变更)
git reset --hard HEAD~1
取消指定的commit(回退到某个历史提交)
git reset --hard <commit_id>
撤销已推送到远程的commit(强制推送)
#首先,使用git reset 取消本地的提交
git reset --hard HEAD~1
#然后,使用git push强制推送
git push --force origin <branch>
撤销已提交但未推送的commit(更改提交信息)
git commit --amend -m "new commit message"
放弃本地修改,强制同步远程
git fetch --all
git reset --hard origin/master #远程分支名称
git fetch
revert
git revert 命令用于创建一个新的commit,该commit会撤销指定commit的修改。
这种修改不会改变历史,而是在历史中添加一个新的commit来抵消之前的更改。
例如,要回滚到HEAD~3(即当前commit的前三个commit),可以执行:
git revert HEAD~3
rebase
git rebase 是git中用于变基操作的命令,主要用于重写提交历史,以保持提交记录的整洁,并避免不必要的合并提交。
基本用法
git checkout <branch-a> #切换到目标分支
git rebase <branch> #将当前分支的提交历史重新应用到指定分支上
等价于
- git fetch 获取最新的branch分支
- 把branch-a上的提交一个个摘下来
- 在branch分支上重新应用这些提交
示例
假设当前git log --oneline --graph 结构如下:
A---B---C (branch)
\
D---E (branch-a)
运行:
git checkout branch-a
git rebase branch
变为:
A---B---C---D'---E' (branch-a)
拉取远程代码时使用rebase
git pull --rebase origin master
等价于:
git fetch origin
git rebase origin/master
交互式变基
git rebase -i HEAD~3 #交互式地重写最近的3个提交
这表示对最近3次提交执行交互式变基,git会打开一个交互界面
pick 1234567 initial commit
pick 2345678 add feature
pick 3456789 fix bug
命令 | 说明 |
---|---|
pick | 保留提交(默认值) |
reword | 修改提交信息 |
edit | 修改该提交的内容 |
squash | 合并该提交到前一个提交,并保持前一个提交的 commit message |
fixup | 合并提交到前一个提交,但不保留提交信息 |
drop | 删除该提交 |
rebase解决冲突
- 手动解决冲突,修改相关文件
- 标记已解决冲突:git add file
- 继续rebase:git rebase --continue
- 中止rebase:git rebase --abort
- 跳过当前冲突:git rebase --skip
cherry-pick
git cherry-pick 是git中用于将指定的提交应用到当前分支的命令。
基本用法
git cherry-pick <commitHash>
git push --force #然后再使用该命令将本次变更强行推送至服务器
git cherry-pick命令的参数,不一定是提交的哈希值,也可以是分支名,表示引入该分支的最新提交
提交多个hash
git cherry-pick <commitHashStart>^..<commitHashEnd> #挑选从commitHashStart开始到commitHashEnd的所有提交
git cherry-pick <commitHash1> <commitHash2> <commitHash3> #挑选一组不连续的提交
git cherry-pick --continue #如果有冲突,解决冲突后使用该命令继续应用下一个提交
git cherry-pick --abort #如果有冲突,使用该命令中止cherry-pick操作
cherry-pick选项
git cherry-pick -e/--edit commitHash #在提交前允许修改提交信息
git cherry-pick -n/--no-commit commitHash1 commitHash2 #将提交应用到当前分支,但不提交
git cherry-pick -x commitHash #在生成的提交中添加原始提交的引用,方便追溯
rm
常用操作
git rm <file> #删除文件并从暂存区删除
git rm --cached <file> #删除文件但保留本地修改
选项
git rm --cached <file> #只从暂存区删除文件,不删除工作区中的文件。通常与.gitignore一起使用
git rm -f/--force <file> #强制删除文件,适用于已修改且未提交的文件
git rm -r/--recursive <dir> #递归删除目录及其内容
删除的文件如何恢复
git restore <file> #如果文件还在版本控制中
git checkout <commitHash> -- <file> #如果文件已经被提交删除
clean
删除所有未追踪文件(未纳入版本控制)
git clean -f
- -f(--force):强制删除未追踪的文件(未git add的文件)
- 注意:此操作不可撤销,执行前请确保不误删重要文件
删除未追踪的目录
git clean -fd
删除未追踪的文件和忽略文件
git clean -xfd
仅查看即将删除的文件(安全检查)
git clean -n
仅删除某个文件或目录
git clean -f xxx.log
git clean -fd logs/
合并merge
将另一个分支的更改合并到当前分支
合并模式
- 快进合并:直接将HEAD移动到目标分支的最新提交,历史记录呈直线
- 三方合并:如果当前分支和目标分支都有各自的提交记录,则会创建一个新的合并提交,记录两个分支的历史
常用选项
git merge --squash featurn #将另一个分支的所有提交压缩为一个提交,然后合并到当前分支。
git merge --abort #合并过程中遇到冲突不想继续合并,可以使用此选项终止合并并恢复到合并前
log
常用命令
git log --pretty=format:"%h %ad %an %s" --author=xxx --since=7.days #查看最近一周的提交记录,或 7 days age
git log --pretty=format:"%h %ad %an %s" --oneline --graph --all -20 #格式化日志并展示提交历史
git log --graph --all -2 #表示显示所有提交
git log --since="2024-01-01" --until="2024-01-31" #显示指定日期范围内的提交
git log <file> #查看指定文件的提交历史
git log <branch> #查看指定分支的提交历史
git log --grep="keyword" #搜索提交信息中包含关键字的提交
git log -p -n 10 #查看最近10次提交的详细信息
- %h:提交的简短哈希值
- %ad:提交的日期和时间
- %an:提交的作者
- %s:提交的注释
- %ar:提交的相对时间