git命令
git命令参数
git archive --output dist.zip commitID [目录或文件] 打包
git branch 查看所有分支git branch -d [分支名] -D 强制删除git blame file 查看某个代码文件每行都是谁写的
git checkout file 撤销工作区修改回到最近一次的git commit或git addgit checkout -b [分支名] 此命令相当于git branch [分支名] 和 git checkout [分支名] 两个命令git checkout -b [分支名] origin/[分支名] 创建并切换到新分支,新分支的内容从远程分支上拉取git checkout main -f 丢弃掉当前分支在工作目录的内容,并切换到main分支git clone [远程仓库地址]git commit -m [注释]git commit --amend 修改最后一次的注释,不加注释则表示把最近修改追加到最后一次提交
git diff-tree commitID --name-only -r --no-commit-id 对比输入的commitID和其前一次提交的差异
git log --graph 可看到分支合并图git log --oneline 一行情书版日志git log --pretty=oneline --abbrev-commitgit log --author=authorName --oneline 查看某人提交记录
git merge [分支名] 把参数中的分支修改合并到当前分支git merge --no-ff -m [注释] \[分支名] 把合并的信息当作commit提交记录下来
git pull [远程主机名] [远程分支名]:[本地分支名]git push -u origin main 第一次推送main分支的所有内容git push origin main 第二次及以后推送main分支上的内容git push -f origin main 强制推送main分支上的内容,本地仓库完全覆盖远程仓库(有些git系统不支持,具有风险性)git push origin --tags 一次性推送所有标签到远程仓库删除远程仓库标签经过两步:①git tag -d [标签]②git push origin :refs/tags/[标签]
git rm 删除一个文件git reflog 记录历史命令git remote 查看远程仓库git remote -v 查看远程仓库详细信息git remote add origin [远程仓库地址]git remote set-url origin [url] 重置远程仓库信息git reset --mixed 默认,把档案留在工作目录git reset --soft 會把档案跟目录留在暂存区git reset --hard 抛弃变化reset不论是哪个参数,不仅HEAD位置会变,git历史记录也会有变化。git reset ORIG_HEAD --hard这个 ORIG_HEAD 会记录最近危险操作(例如 reset、rebase、merge 等操作)之前的纪录点,但只会记录最后一次。所以万一不小心被洗掉的话,可以再去翻一下 git reflog。
git show commitID 显示某次提交的详细信息git statusgit stashgit stash list 查看所有stashgit stash apply 恢复git stash drop 删除stashgit stash pop 恢复并删除stash
git tag 查看所有表签git tag [标签]git tag [标签] \[commitID] 为某个commitID打上标签git tag -d [标签] 删除标签
常见操作的场景
1. 撤销修改说明① 未add git checkout --file 或 手动删除工作区修改 工作区clean 暂存区clean② add git reset HEAD file (将暂存区修改删除) 暂存区clean 工作区wait add git checkout --file (暂存区恢复到工作区) 工作区clean 暂存区clean③ add commit git reset --hard HEAD^ (版本回退) 工作区clean 暂存区clean
2. git 一个分支完全覆盖另一个分支git checkout main // 切换到旧的分支git reset --hard develop // 将本地的旧分支 main 重置成 developgit push origin main --force // 再推送到远程仓库
3. 空项目推送到git上git initgit remote add origin [远程地址]git add . && git commit -m "注释"git push -u origin main
4. 拉取submodulegit submodule update --init --recursive
5. git add 忽略文件1)忽略文件: git update-index --assume-unchanged filename2)取消忽略文件: git update-index --no-assume-unchanged filename
删除远程repo的某个文件夹,然后增加到.gitignoregit rm -r --cached some-directorygit commit -m 'chore: Remove the now ignored directory "some-directory"'git push origin master
6. 将远程库的单个文件回退到某一版本`工作区 - 暂存区 - 本地仓库区`- 1)git log demo.js- 2)git reset [回退到的commit id] demo.js 将本地仓库库和暂存区中的文件回退到历史版本- 3)git checkout demo.js 暂存区中文件的历史版本覆盖工作区中对应的文件- 4)git add commit push 正常提交
7. dev merge main后revert,然后dev和main都有新的提交,dev如何merge main?- git rebase -i [startpoint] [endpoint] # [startpoint] [endpoint]是前开后闭的区间,[endpoint]一般是省略不写的,默认从起始的commit一直到最后一个commit,如果写了[endpoint],那么[endpoint]后面的commit就全都不要了 - 进入交互,第一个pick不动,其他的改为s,从上到下提交的时间是从早到晚,然后x保存退出,这样多个commit记录就合并了 - 然后会进入到log合并界面,除了第一个提交信息其他用`#`注释掉 - 保存,使用git log --online查看修改情况 - 如果远程分支在rebase前提交了则用git push -f强推,并记录本次提交commitA- git reset --hard commit_id # reset到dev merge main后的commit- git merge origin/main- git reverse commit_id # 此处的commit_id为dev merge main后revert产生的- git cherry-pick commitA的commit_id
8. git describegit describe <ref>
<ref> 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(HEAD)。它输出的结果是这样的:<tag>_<numCommits>_g<hash>tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。
.gitignore 配置文件
- 配置语法:
以斜杠“/”开头表示目录;
以星号“*”通配多个字符;
以问号“?”通配单个字符
以方括号“[]”包含单个字符的匹配列表;
以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;
此外,git 对于 .ignore 配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;
- 示例:
(1)规则:fd1/* 说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略;
(2)规则:/fd1/* 说明:忽略根目录下的 /fd1/ 目录的全部内容;
(3)规则:
/* !.gitignore !/fw/bin/ !/fw/sf/说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;
git配置
- 配置git用户名和邮箱
git config user.name "用户名"git config user.email "邮箱"
在config后加上 —global 即可全局设置用户名和邮箱。
- 生成ssh key
ssh-keygen -t rsa -C "邮箱"
- git拉取代码的时候,会自动将代码中的换行方式转化成你当前系统的换行方式。
git config --global core.autocrlf false
- 对文件夹大小写敏感
git config core.ignorecase false --global
monorepo
- 初始化
lerna init
- package.json
{ "name": "root", "private": true, "scripts": { "i": "lerna bootstrap", "dev:main": "lerna run dev --scope=main", "build:main": "lerna run build --scope=main" }, "workspaces": { "packages": [ "packages/*" ], "nohoist": [ "main/**" ] }, "devDependencies": { "lerna": "^5.1.4" }}
- lerna.json
{ "packages": [ "packages/*" ], "npmClient": "yarn", "useWorkspaces": true, "registry": "xxxx", "command": { "run": { "stream": true }, "bootstrap": { } }, "version": "independent"}
- 导入存在的项目
lerna import --flatten --preserve-commit /Users/xxx/code/old-project